sve*_*vit 8 .net c# oop polymorphism design-patterns
首先抱歉这个问题很长,但我写的不能更短:)
现实世界的例子:我们有大卷纸,上面印有小"贴纸".每个贴纸都有一个代码.代码的前两个字母告诉我们这是什么样的贴纸(代表新卷的贴纸,代表当前卷的末端的贴纸,应该进行质量控制的贴纸,......但是大多数是正常的枚举贴纸) .
例如,代码为XX0001的贴纸意味着,在它之后应该只有正常的枚举代码(如NN0001到NN9999),总是相同的数字.代码QC0001告诉我们,接下来的10个代码(从QC0001到QC0010)应该进行质量控制.
我设计的应用程序,这样,每种类型的标签是它自己的类- ,NormalSticker,,BadSticker ,...他们都从SticerBase类,其中包含了一些常用的数据为所有这些(扫描,日期和时间的质量继承扫描,代码内容).这些类的实例是在静态Parser类中创建的,该类检查代码并将适当的对象返回给我们.ControllStickerQualitySticker
一切正常,但现在我停了下来.我还有一个Roll类,它有一组贴纸,实现为List<StickerBase>.这个类有一个公共AddSticker(StickerBase)方法,我们用它来添加贴纸.但是这个方法应该包含一些逻辑,例如,如果我们得到代码XX001,那么下一个9999贴纸应该是从NN0001到NN9999.我在这里看到的唯一选择是根据贴纸的类型做出决定,例如:
public void AddSticker(StickerBase sticker)
{
if (sticker.GetType().Equals(typeof(StickerNewRoll)))
{
// Next 9999 sticker should be in the form of NN0001 to NN9999
}
if (sticker.GetType().Equals(typeof(EnumeratedSticker)))
{
// Add 9999 stickers to the list, other business logic...
}
if (sticker.GetType().Equals(typeof(QualitySticker)))
{
// Stop the machine and notify the worker
}
}
Run Code Online (Sandbox Code Playgroud)
如果这是正确的方法,我会感到非常惊讶.有任何想法吗?
编辑 - 可能的解决方案:因为对于每个贴纸,我知道下一个贴纸的样子,我可以public Sticker NextStickerShouldLookLike()为每个Sticker类添加新的方法.在验证逻辑中(类似于PéterTörök的回答)我可以检查当前贴纸是否与之相同previousSticker.NextStickerShouldLookLike().Validate方法有两个输入参数 - 当前和以前的贴纸.
您想在一次移动中添加与特定贴纸相关联的贴纸集,还是要验证添加的贴纸是否符合最新特殊贴纸设置的约束?
在第一种情况下,您可以GetAssociatedStickers()在贴纸类中添加多态方法,将贴纸组从NN0001返回到NN9999到贴纸代码XX001等.然后您可以在控制贴纸后面添加这组贴纸.
对于验证,您可以在贴纸类中使用新界面StickerValidator和方法GetValidator.特殊贴纸将返回一个正确的验证器对象(可以实现为匿名类或内部类),而常规贴纸将返回null.然后AddSticker可以修改看起来像
public void AddSticker(StickerBase sticker)
{
if (sticker.GetValidator() != null)
{
this.validator = sticker.GetValidator();
// add the sticker to the list
}
else
{
if (this.validator == null || this.validator.validate(sticker))
{
// add the sticker to the list
}
else
{
// set error state
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以看到其他答案中存在激烈的争论,但我不确定是否可以在不更深入地检查您的示例的情况下找到一个好的解决方案。
首先,您有三个类:Roll、创建贴纸的解析器以及贴纸本身(分为派生类)。也许还有另一个类实现了一些您没有提到的业务逻辑?也许值得描述一下...
第一个问题是:鉴于某个类负责将贴纸附加到卷上(解析器类?),您是否可以让卷与它接收的贴纸完全矛盾,并将您的逻辑放在其他地方?当贴纸是 X 类型时,该做什么的逻辑真的是该卷需要了解的吗?考虑到不是该卷出去并获得贴纸?
第二个是:你的贴纸有多态?他们有不同的方法吗?它们有不同的属性吗?或者它们是否足够相似以至于您可以在 StickerBase 类上添加标签?
第三个问题是:是否应该由贴纸来告诉卷轴该做什么?IE 应该滚动调用该方法sticker.TellMeWhatToDoNextPlease()(作为虚拟方法实现并在贴纸的派生类中进行 ovveridden) - 特别是因为滚动不负责人们试图粘贴在其上的内容。您可以向负责将贴纸贴在卷上的班级问同样的问题。你可以训练一只猴子来做这件事,让卷筒弄清楚它,或者你可以把你的逻辑放在那里(如果是贴纸的地方,它应该已经知道它在做什么)并让卷筒接受它所粘的东西。
基本上 - 什么控制着你的流程?上面贴有贴纸的纸卷、贴纸本身,还是任何制作和粘贴贴纸的东西?
| 归档时间: |
|
| 查看次数: |
581 次 |
| 最近记录: |