11

Scala には、オブジェクト構成を表現するための 2 つの手段があります。独自の自己型概念と、よく知られている自明な構成です。どのシチュエーションでどのシチュエーションを使えばいいのか興味津々です。

それらの適用性には明らかな違いがあります。セルフタイプでは、特性を使用する必要があります。オブジェクト構成では、var 宣言を使用して実行時に拡張子を変更できます。

技術的な詳細は置いておいて、ユース ケースの分類に役立つ 2 つの指標を考えてみます。ツリーなどの複雑な構造のコンビネータとして使用されるオブジェクトや、いくつかの同様のタイプのパーツ (1 台の車と 4 輪の関係) がある場合は、コンポジションを使用する必要があります。極端に反対のユースケースがあります。1 つの特性が大きくなりすぎて明確に観察できなくなり、分割されたとします。この場合、自己型を使用する必要があるのはごく自然なことです。

そのルールは絶対的なものではありません。この手法間でコードを変換するために余分な作業を行う場合があります。たとえば、4 つの車輪の構成を Product4 のセルフタイピングに置き換えることができます。for cake パターンの依存関係Cake[T <: MyType] {part : MyType}の代わりに使用できます。Cake { this : MyType => }しかし、どちらの場合も直感に反しているように見え、余分な作業が必要になります。

ただし、境界のユースケースはたくさんあります。1 対 1 の関係を決定するのは非常に困難です。どのような手法が好ましいかを判断する簡単なルールはありますか?

自己型はクラスを抽象化し、構成はコードを冗長にします。self-type を使用すると、名前空間の混合に関する問題が発生し、無料で追加のタイピングが可能になります (2 つの要素のカクテルだけでなく、ガソリン爆弾として知られるガソリンとモーター オイルのカクテルも得られます)。

それらの中からどのように選択できますか?どんなヒントがある?

アップデート:

次の例について説明します。

アダプターパターン。セルトタイピングとコンポジションの両方のアプローチでどのような利点がありますか?

4

1 に答える 1

3

以下のヒントは、ヒューリスティック アプローチ (アルゴリズム アプローチが実用的でない場合に使用される問題解決の試行錯誤法) から導き出されたものであり、いかなる公式 (数学ベースの推論) によってもサポートされていません。

***ここで与えられたヒントは、付随するヒントを参照して評価する必要があります。コンポジションとセルフタイピングのユースケースを区別するための完全なルールはヒントではありません。

(以下のヒントに従っていますが、コードの冗長性や行数、プログラミング作業の入力などは気にしたり、集中したりしません。)

合成(辞書的意味):部分または要素を組み合わせて全体を形成する行為(自明な合成)

特性(辞書の意味):際立った特徴または品質

自明な構成のヒント(スーパー - サブクラスのメカニズムまたは関連関係によって実現できます) (例: 車と車輪):

  • 個別にカウントできるもの (例: 車輪)

  • (さまざまな基準に基づいて)さらに分類できるもの(例:ホイール - 合金ホイール、スチールホイールなど)

  • どちらを追加または削除できますか (注: ホイールが停止したということは、実際にはホイールの回転速度が停止したことを意味し、心臓が停止したことは、実際には心臓の脈動速度がゼロになったことを意味します)

  • 一般的に少数に適用可能 (宇宙では、一部の乗り物と一部の機械には車輪があります) (少数は 10 ~ 15 または数百万の場合もあります - 説明するために、ステートメントを理解しましょう: 地質学者が時間について話し、少し前に言うとき、それは数百万を意味します。数年前、実際の被写体によって異なります)

自己タイプ(特性) のヒント (例: 車と速度):

  • これは(物理学の観点からではなく)一次元であり、数直線上にプロットできます(物理単位が何であれ)(例:速度)

  • これ以上自然に分類することはできません (例: 速度) (または、少なくともそれ以上分類することはありません) ここで、分類するために独自の基準に依存する必要があり、明確な何百万ものサブタイプに分類される可能性があります。移動すると、数百万の移動サブ特性を持つことができます...ジグザグ移動、回転、前進など... (さまざまな順列の組み合わせで数百万の可能性があります)。

  • どれを増やしたり減らしたり止めたりできるか (例: 速度、怒り、愛など)

  • 一般的に見られる/非常に離れたクラスで見られるもの (例: 光の速さ、地球の速さ、走者の速さ)

  • 一般的に多くに適用可能 (宇宙の大部分 (ここではすべての) オブジェクトには速度があります)

    ソフトウェア開発は、自分の宇宙を作るようなものであり、クリエイターとしてすべてを定義します。特性は、ドメイン (自分の宇宙) 内の遠くに配置されたクラス間で見られます。

自明な構成に使用される部分について、どの言語でも特定の単語(ここでは特性の対応物)を見たことがないことに注意してください(私はほとんど知りません)。

さらなる説明:

答えを得るには、ソフトウェア開発のクラス指向またはオブジェクト指向の哲学の深いところを見つける必要があり、java や scala (またはそれ以上) などのプログラミング言語の作成者の心と論理を理解する必要があります。それらの言語内に教え込まれたクラス指向またはオブジェクト指向のパラダイム。

もう 1 つ必要なことは、実世界とキーワードの背後にあるセマンティクスを記述するために使用するセマンティクス (意味の研究、または意味と形式の変化を分類して調べることによる言語発達の研究) の深い理解です (プログラミング言語で)。 ) プログラマーとして使用します。

クラスを作成するとき、私たちは現実世界をソフトウェアにマニフェストしたいと考えています。クラスは、車、人間、星、夢、思考、想像力など、現実世界の何かの表現になります。

誰かが「車輪」と言うと、その形状と用途が明確にイメージでき、車輪を駆動すること、または道路を転がる車輪を思い浮かべることができます。ホイールは常に何かの一部です。離散的な数で数えることができます。ホイールは、材料、用途、サイズなどの基準に基づいてさらに分類できます。ホイールのようなものは、自明な構成の資格があります。

誰かが「スピード」と言うとき、あなたはそれを明確に描写することはできません... 形も色もありません. それは特徴、特性です。速度は何の一部でもありません。それはそこにあるかもしれないし、そこにないかもしれない。1 本の線 (+ または - のいずれかの方向) にプロットできます。「スピード」を分類するのは難しいです。スピードのようなものは特性の資格があります。

私の意見では、

Car をクラス (オブジェクト) として使用する場合、"速度" のような特性は scala のトレイトとして使用する必要があります。そして、「車輪」のようなパーツ、コンポーネントは「トリビアル コンポジション」として入る必要があります。「速度」のような特性には自然な分類がありません。「車輪」は多くのクラスを持つことができ、それら自体は (実際には) 独立したオブジェクトです。

人間をクラス(オブジェクト)に例えると、「怒り、泣き、笑いなど」です。行動のようなものは、特性と「手、脚、脳、心臓など」として行く必要があります。それら自体が(実際には)独立したオブジェクトであるため、「自明な構成」として入る必要があります。

名前を考えると、誰にでも付けることができる名前です。たとえば、最も近い星の名前は「太陽」、最も高い山の名前は「ヒマラヤ」、私の犬の名前は「ロッキー」、川の名前は「アマゾン」です。 「....「名前」は特性であり、「些細な構成」と見なされるべきではありません。

心を考えると、動物には心があります。これは、特性としてではなく、「自明な構成」と見なす必要があります。

クラスとは?

クラスは、特定のオブジェクトの説明または設計図です。

オブジェクトとは?

オブジェクトは、クラス定義によって記述できる現実です。

(卵か雌鶏か? どちらが先か?) ソフトウェア エンジニアはまずオブジェクトについて考え、次に (それらを記述または作成するために) (設計図から) クラスを定義します。(IN Object Oriented Modeling and Design - Class と Object は互いの存在を補完していることに注意してください。) ( 「卵か鶏? どちらが先か? はクラスとオブジェクトの共存のためのものであり、有名な Circle-Eclipse とは関係ありません。問題 (http://en.wikipedia.org/wiki/Circle-ellipse_problem) 後者は継承またはサブタイプ ポリモーフィズムに関連しています。)

インターフェイス: 別々の、時には互換性のない要素を効果的に調整できるようにするもの

ソフトウェア開発は、自分の宇宙を作るようなものであり、クリエイターとしてすべてを定義します。継承よりも構成を優先する必要があります。(ギャング・オブ・フォー - デザイン・パターン)

于 2012-06-17T17:12:02.323 に答える