我的对象应该负责随机化自己的内容吗?

问题描述 投票:3回答:2

我正在构建一个应用程序,可以生成随机的音符序列,并将其作为乐谱显示给用户。可以根据若干参数生成这些序列,包括密度和相同音高的最大连续音符。

音乐序列由sequence对象捕获,其notes属性是一个简单的音符串,如"abcdaba"

我早期尝试生成随机序列涉及使用几种私有方法编译随机序列的SequenceGenerator类。这看起来像是对我的服务。但我试图遵守域驱动设计(Evans 2003)中表达的原则,只在必要时使用服务,并倾向于将行为与域对象相关联。

所以我的问题是:

生成随机序列的工作是否应该通过sequence本身的公共方法(例如generateRandom())来处理,还是应该分开?

我认为我的原始设计更像是一个构建器或工厂模式而不是服务的可能性,但是创建随机序列的代码与创建一个带有提供的字符串的代码非常不同。

我对方法路线的一个担忧是generateRandom()作为sequence上的方法改变了序列的内容,但实际上并没有生成新的序列对象。这只是感觉不对,但我无法表达原因。

我仍然围绕着一些核心OO设计原则,所以非常感谢任何帮助。

oop domain-driven-design factory builder
2个回答
1
投票

是否应该通过序列本身的公共方法(例如generateRandom())来处理生成随机序列的工作,还是应该将它们分开?

我通常发现,如果我将“随机”视为对待“时间”或“I / O” - 作为模型的输入,而不是作为模型本身的一个方面,我会得到更清晰的设计。

如果你不把时间视为输入值,那么在你做之前要考虑它 - 这是一个重要的概念(John Carmack, 1998)。

在DDD的约束下,这可能意味着将“域服务”作为参数传递给您的方法,允许您的聚合根据需要调用服务,或者它可能意味着在聚合上有一个方法,以便应用程序可以通过需要时随机数。

因此,任何序列的创建都会涉及传递一些模式或种子,但是这是否是随机的是在序列本身之外决定的?

对,就是这样。


0
投票

对象的创建通常不被视为对象逻辑的一部分。

你如何在技术上做到这一点是另一回事。你可以使用委托。例如:

public interface NoteSequence {
    void play();
}

public final class LettersNoteSequence implements NoteSequence {
    public LettersNoteSequence(String letters) {
       ...
    }
    ...
}

public final class RandomNoteSequence implements NoteSequence {
    ...
    @Override
    public void play() {
       new LetterNoteSequence(generateRandomLetters()).play();
    }
}

这样您就不必拥有“服务”或“工厂”,但这只是一种替代方案,可能适用于您的用例,也可能不适合您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.