最近,我一直在设计动物生活模拟器,最终遇到了一些设计问题。我会尽可能地总结一下,只指出必要的(我认为)。
我试图让生物有能力繁殖。然而,有些人会有性生殖,并且无性繁殖。
由于希望在open/close princible之后保持设计的动态性和灵活性,我决定使用strategy pattern,最后得出以下情况:
尽管能够创建不同类型的复制品,每种类型都有自己的算法,但有性生殖的类型需要一个参数,这将是另一种生活方式。
研究互联网时,我发现可以修改策略模式以利用可扩展的参数类型。考虑到这一点,我决定为ReproduceBehavior上存在的方法重现创建一个参数。这就是我得到的:
我真正怀疑的是不同类型的再现参数的实现。
即使我为有性生殖创造了一个参数,对无性繁殖也没有意义,对吧?出于什么原因,我为无性繁殖提供参数?如果你告诉我它没问题,只要我在方法的实现中忽略这个参数,这是可以接受的,那就好了。
那么,我该如何实现有性生殖的参数呢?我应该创建一个名为 SexualParameter 的具体类来实现接口 ReproductionParameter 吗?另外,如何让 SexualReproduction 认识到它的 ReproductionParameter 是 SexualParameter ?我应该使用 instanceof 吗?这是否正确(最佳做法)?
我真的很困惑。有谁可以帮助我?
由于我的同伴发誓要结束我的问题,我正在编辑它以使其受到更多限制,并且有特定的标准需要解决。所以我们走了......
我们在谈论复制,对吗?我不能简单地在模拟器中模仿现实生活(现在,我相信......),但我可以接近这种情况(毫不夸张)。所以我在这里公开并更好地定义复制标准:
我会接受任何满足这些规则的设计。能够满足这些条件的第一个答案对我来说是正确的。如果你将基于我们在这里谈论的内容并不重要......正如我所说,只需要满足这些规则。
坦率地说,有一套规则和标准可用于完成良好的设计。有一点可以肯定,这里已经证明了这一点。代码重用是任何设计的关键。这可以通过不同的方式完成,其中一种方法是使用继承。当继承最终损害重用时,不应该使用它。
对于我的程序员,不要将项目设计视为基于意见的东西。项目设计是严肃而具体的。没有人根据自己的意见创建代码片段。这让我想起了Entity Relationship Model(ERM)。这是一门精确的科学,只有案例的变化,而不是我们根据每个规则应用建模的方式。同样,类建模不是基于意见的事物。那里的版主退伍军人只是在没有方向的情况下徘徊吗?有时我后悔不知道某些事情。
答案 0 :(得分:3)
我认为" ReproductionBehaviour"在某种程度上某些物种可能同时具有性和无性繁殖行为(虽然,我知道每个物种都需要至少有一种繁殖方法),这在某种程度上是不自然的。
这就是我的模特
interface SexualReproduction<T extends LivingBeing>{
void reproduce(T partner);
}
interface AsexualReproduction{
void reproduce();
}
abstract class LivingBeing{
}
class Cat extends LivingBeing implements SexualReproduction<Cat>{
@Override
public void reproduce(Cat partner) {
}
}
class Bacteria extends LivingBeing implements AsexualReproduction{
@Override
public void reproduce() {
}
}
class Starfish extends LivingBeing implements AsexualReproduction,SexualReproduction<Starfish>{
@Override
public void reproduce(Starfish partner) {
}
@Override
public void reproduce() {
}
}
答案 1 :(得分:0)
我会支持几步并询问,&#34;这将如何使用?&#34;答案是来电者需要知道LivingBeing
是否有性或无性。因为他们需要知道传递ReproductionPartner
,对吧?或者它应该是一个空参数。因此,我不确定SexualReproduction
和AsexualReproduction
基于通用界面是否有意义。只有在调用代码可以交换它们而不关心实际使用哪个接口时,它才真正起作用。 This is the L is SOLID
所以你可能不想要额外的参数。这意味着让LivingBeing
足够聪明,知道他们要用谁来复制(这意味着你可能想要LivingBeing
的子类或接口),或者放弃共同ReproductiveBehavior
的想法。 1}}。