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