gpt4 book ai didi

scala - 如何区分组合和自类型用例

转载 作者:行者123 更新时间:2023-12-04 02:25:24 25 4
gpt4 key购买 nike

Scala 有两种表达对象组合的工具:原始的自类型概念和众所周知的平凡组合。我很好奇我应该在哪些情况下使用。

它们的适用性存在明显差异。自我类型要求您使用特征。对象组合允许您使用 var 声明在运行时更改扩展。

抛开技术细节,我可以找出两个指标来帮助对用例进行分类。如果某些对象用作复杂结构的组合器,例如树或只有几个相似类型的部件(1 辆车到 4 个轮子的关系),则应使用组合。有极端相反的用例。让我们假设一个特征变得太大而无法清楚地观察到它并且它被 split 了。在这种情况下,您应该使用自类型是很自然的。

这个规则不是绝对的。您可以做额外的工作来在这些技术之间转换代码。例如您可以在 Product4 上使用自输入替换 4 个轮子组合。您可以使用 Cake[T <: MyType] {part : MyType}而不是 Cake { this : MyType => }对于蛋糕模式依赖。但是这两种情况似乎都违反直觉,并且会给您带来额外的工作。

虽然有很多边界用例。一对一的关系很难决定。是否有任何简单的规则来决定哪种技术更可取?

self 类型使您的类抽象,组合使您的代码冗长。 self-type 给你混合命名空间带来的问题,还给你额外的免费打字(你不仅得到了两种元素的鸡尾酒,还有被称为汽油弹的汽油发动机油鸡尾酒)。

我该如何在它们之间进行选择?有什么提示?

更新:

让我们讨论以下示例:

适配器模式。它对选择类型和组合方法有什么好处?

最佳答案

下面的提示来自启发式方法(当算法方法不切实际时使用的问题解决的试错法),不受任何公式支持(基于数学的推理)。

***此处给出的提示应引用随附的提示进行评估,没有提示是区分组合和自键入用例的完美规则。

(虽然遵循下面提到的提示,但我并不关心或关注代码的冗长或行数或编程工作输入。)

组合(字典的意思):将部分或元素组合成一个整体的行为(琐碎的组合)

trait(字典的意思):一个显着的特征或品质

琐碎组合的提示 (可以通过超子类机制或关联关系实现)(例如Car和Wheels):

  • 可以离散计数(例如车轮)
  • 哪些可以进一步分类(根据不同的标准)(例如车轮 - 合金车轮、钢车轮等)
  • 哪些可以加也可以去掉(注:我们说轮停,其实是轮的转速停了,说心脏停了,其实是心脏的搏动速度变为零了)
  • 一般适用于少数(宇宙中一些车辆和一些机械有轮子)
    (少数也可以是 10-15 或几百万 - 解释一下让我们理解这句话:本地质学家谈论时间时说一段时间前,意思是几百万年前,这取决于实际主题)

  • 自我类型提示 (特质)(例如汽车和速度):
  • 这是一维的(不是物理方面的),可以绘制在数轴上(无论物理单位是什么)(例如速度)
  • 哪个不能自然地进一步分类(例如速度)(或者至少你不会进一步分类)在这里,自然地这个词用来传达这样的意思,要对它进行分类,你将不得不依赖于你自己的标准,并且会有一个确定的将其分类为数百万个子类型的可能性。采取行动,您可以拥有数百万个移动子特征......例如锯齿形移动,旋转和前进,......(具有各种排列组合的百万可能性)。
  • 可以增加或减少或停止(例如速度,愤怒,爱等)
  • 通常可以在非常遥远的类别中看到/可以看到(例如光速,地球速度,运行者的速度)
  • 一般适用于许多(宇宙中大多数(这里每个)物体都有速度)

    软件开发就像创造你自己的宇宙,作为一个创造者,你定义一切。在你的领域(你自己的宇宙)中距离遥远的类中会看到一个 Trait。

  • 请注意,我没有在任何语言(我知道的很少)中看到任何用于琐碎组合的特定词(这里是 trait 的对应词)。

    进一步说明:

    要获得答案,您需要在软件开发的面向类或面向对象的哲学思想深处找到某个地方,并且需要了解编程语言(例如 java 和 scala(或更多))的创建者的思想和逻辑,它们具有在这些语言中灌输了面向类或面向对象的范式。

    你需要的另一件事是对语义的深刻理解(通过对意义和形式的变化进行分类和检查来研究意义或语言发展的研究),我们用它来描述现实世界和关键字背后的语义(在编程语言中) ) 我们用作程序员。

    我相信,当我们创建类时,我们希望将现实世界体现在软件中。类成为现实世界中某些事物的表示,可能是汽车、人类、明星、梦想、思想或想象力等。

    当有人说“车轮”时,您会对其形状和应用有清晰的了解,您可以想到驱动轮或在道路上滚动的车轮。轮子永远是某物的一部分。可以用离散的数字来计算。轮子可以根据 Material 、应用、尺寸等标准进一步分类。轮子之类的东西有资格获得平凡的组合。

    当有人说“速度”时,你不会有任何清晰的图像……没有形状……没有颜色……但你可以将它与宇宙中任何移动(相对论)的部分联系起来。这是一个特点,特质。速度不是任何事情的一部分。它可以在那里,也可以不在那里。它可以绘制在一条线上(方向 + 或 - )。很难对“速度”进行分类。速度之类的东西有资格成为特质。

    在我看来,

    如果我们将 Car 作为一个类(对象),“速度”之类的特征应该作为 Scala 中的 trait。和“轮子”一样的零件,组件应该作为“琐碎的组合”。 “速度”之类的特征不会有自然的分类,其中“轮子”可以有很多类,它们本身是独立的对象(实际上)。

    如果我们把Human作为一个类(Oject),“愤怒、哭泣、大笑等”。喜欢的行为应该作为特征和“手、腿、大脑、心脏等”。应该作为“琐碎的组合”进入,因为它们本身是独立的对象(实际上)。

    如果我们想到名字,它可以给任何人和任何人,例如离我们最近的星星有一个名字“太阳”,最高的山有一个名字“喜马拉雅”,我的狗有一个名字“洛基”,河流有一个名字“亚马逊” "...."名称"是一个特征,不应被视为"琐碎的作文"。

    如果我们想到心脏,动物就有心脏作为它们的一部分。它必须被视为“琐碎的组成”而不是作为一个特征。

    什么是类(class)?

    类是特定对象的描述或蓝图。

    什么是对象?

    对象是可以通过类定义来描述的现实。

    (鸡蛋还是母鸡?哪个先出现?)我相信,软件工程师首先想到对象,然后(描述它们或制造它们)(从蓝图中)定义类。 (请注意 IN Object Oriented Modeling and Design - Class 和 Object 是互补的。)问题(http://en.wikipedia.org/wiki/Circle-ellipse_problem)因为后者与继承或子类型多态性有关。)

    界面:使单独的、有时不兼容的元素能够有效协调的东西

    软件开发就像创造你自己的宇宙,作为一个创造者,你定义一切。组合应该优先于继承。 (四人组 - 设计模式)

    关于scala - 如何区分组合和自类型用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060105/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com