Scala有两种用于表达对象组成的工具:原始的自我类型概念和众所周知的琐碎构图。我很好奇我应该使用哪种情况。
它们的适用性存在明显差异。自我类型要求您使用特征。对象组合允许您使用var声明在运行时更改扩展名。
留下技术细节我可以找出两个指标来帮助分析用例。如果某些物体用作复杂结构的组合器,例如树或只有几个相似的类型部件(1车到4轮关系),它应该使用组合物。有一个极端相反的用例。让我们假设一个特征变得太大而无法清楚地观察它并且它被分裂了。在这种情况下你应该使用自我类型是很自然的。
这个规则不是绝对的。你可以做额外的工作来在这些技术之间转换代码。例如你可以用Product4上的自我打字替换4个轮子组成。对于蛋糕模式依赖关系,您可以使用Cake[T <: MyType] {part : MyType}
代替Cake { this : MyType => }
。但这两种情况都是违反直觉的,给你额外的工作。
虽然有很多边界用例。一对一的关系很难决定。是否有任何简单的规则来决定哪种技术更可取?
self-type使你的类抽象化,组合使你的代码变得冗长。自我类型给你混合命名空间的问题,并且还免费为你提供额外的打字(你不仅仅是两种元素的混合物,而是汽油机油鸡尾酒,称为汽油炸弹)。
我如何在它们之间做出选择?有什么提示?
更新
让我们讨论以下例子:
适配器模式。它采用自我打字和组合方法有什么好处?
答案 0 :(得分:3)
以下提示源自启发式方法(当算法方法不切实际时使用的问题解决的试错法),并且不受任何公式支持(基于数学的推理)。
***这里给出的提示应该参考随附的提示进行评估,没有提示是区分组合和自我打字用例的完美规则。
(虽然遵循下面提到的提示,但我并不关心或关注代码或编程工作输入的冗长或行数。)
组成(字典意思):将部分或元素组合成一个整体的行为(普通组合)
trait(字典意思):区别特征或品质
琐碎作文的提示(可以通过超级子类机制或关联关系实现)(例如汽车和轮子):
可以离散计算(例如,车轮)
可以进一步分类(基于不同的标准)(例如车轮 - 合金车轮,钢轮等)
可以添加或删除(注意:当我们说轮子停止时,它实际上是轮子的旋转速度停止,当我们说心脏停止时,它实际上是心脏的脉动速度已成为零)
一般适用于少数(在宇宙中有些车辆和一些机械有车轮) (少数也可能是10-15或数百万 - 为了解释让我们理解这句话:当地质学家谈论时间并说一段时间之前,它意味着几百万年前,它取决于实际主题)
自我类型的提示(特质)(例如,汽车和速度):
这是一维的(不是物理学的),可以在数字线上绘制(无论物理单位是什么)(例如速度)
不能自然地进行分类(例如速度)(或至少你不会进一步对其进行分类)在这里,自然用词来表达对其进行分类的意义,你将不得不依赖于你的自己的标准,并且有可能将其分类为数百万个子类型。采取行动,你可以有数百万个移动子特征...像之字形移动,旋转和前进,......(各种排列组合的百万种可能性)。
可以增加或减少或停止(例如速度,愤怒,爱等)
在非常偏远的班级(例如光速,地球速度,跑步者速度)中可以看到/可以看到
一般适用于许多(在宇宙中占多数(此处为每个)对象都有速度)
软件开发就像制作自己的宇宙一样,作为创作者,你可以定义一切。在您的域(您自己的宇宙)中远程放置的类中将会看到特征。
请注意,我没有看到任何语言(我知道很少)的任何特定单词(此处为特质对应单词)用于琐碎组合的部分。
进一步说明:
要获得答案,您需要深入了解面向类或面向对象的软件开发的哲学,并需要了解编程语言(如java和scala)的创建者的思想和逻辑(或更多在这些语言中灌输了面向类或面向对象的范式。
你需要的另一件事是深刻理解语义学(意义研究或通过分类和检验意义和形式的变化来研究语言发展),我们用它来描述现实世界和关键词背后的语义(在编程语言)我们用作程序员。
我相信,当我们创建课程时,我们希望将现实世界表现为软件。这个课程代表了现实世界中的某些东西,可能是汽车,人类,星星,梦想,思想或想象等。
当有人说&#34;车轮&#34;时,你会看到它的形状和应用的清晰画面,你可以想到在公路上滚动的驱动轮或车轮。轮子永远是某种东西的一部分。它可以用离散数字计算。车轮可以根据材料,应用,尺寸等标准进行进一步分类。车轮类似于琐碎组合。
当有人说&#34;速度&#34;时,你将不会有任何明确的切割图片......没有形状......没有颜色......但你可以将它与任何移动(相对论)部分联系起来在宇宙中。这是一种特征,特征。速度不属于任何事物。它可以存在或不存在。它可以绘制在一条线上(方向+或 - )。很难对&#34; Speed&#34;进行分类。速度就像事物有资格获得特质。
在我看来,
如果我们将Car作为一个类(对象),&#34; Speed&#34;喜欢的特征应该像scala中的特征一样。并且&#34; Wheel&#34;像部件一样,组件应该作为&#34; Trivial Composition&#34;进入。 &#34;速度&#34;喜欢的特性不会有自然的分类,其中&#34;车轮&#34;可以有很多类,它们本身就是独立的对象(实际上)。
如果我们把人类当作一个阶级(Oject),那么,愤怒,哭泣,大笑等等。喜欢的行为应该像特质和手,腿,大脑,心脏等一样。&#34;应该进入&#34;琐碎的组合&#34;因为他们自己是独立的对象(实际上)。
如果我们想到名字,它可以被赋予任何东西,任何人,即我们最近的星星都有一个名字&#34;太阳&#34;,最高的山有一个名字&#34;喜马拉雅&#34;,我的狗有一个名字&#34; Rocky&#34;,这条河有一个名字&#34;亚马逊&#34; ....&#34;名字&#34;是一种特质,不应被视为&#34;琐碎的组合&#34;。
如果我们想到心脏,动物就会以心为本。必须考虑到&#34;普通组合&#34;而不是一种特质。
什么是课程?
Class是特定Object的描述或蓝图。
什么是对象?
对象是一个可以通过类定义来描述的现实。
(蛋还是母鸡?哪个先出现?)我相信,软件工程师首先想到的是对象,然后(描述它们或制作它们)(来自蓝图)定义类。 (请注意IN面向对象的建模和设计 - 类和对象是相互补充的存在。)(&#34;蛋或母鸡?哪个先出现?是为了类和对象的共存而没有与着名的Circle-Eclipse问题(http://en.wikipedia.org/wiki/Circle-ellipse_problem)相关,因为后者与继承或子类型多态性有关。)
interface:能够使单独的,有时不兼容的元素有效协调的东西
软件开发就像制作自己的宇宙一样,作为创作者,你可以定义一切。组合应优先于继承。 (四人帮 - 设计模式)