2015-10-19 3 views
5

私はファロの内部を覗きや算術+の定義と気づいた - は非常に似て:算術+と基本的に重複したコードのPharo定義はなぜですか?

+ aNumber 
"Refer to the comment in Number + " 
aNumber isInteger ifTrue: 
    [self negative == aNumber negative 
     ifTrue: [^ (self digitAdd: aNumber) normalize] 
     ifFalse: [^ self digitSubtract: aNumber]]. 
aNumber isFraction ifTrue: 
    [^Fraction numerator: self * aNumber denominator + aNumber numerator denominator: aNumber denominator]. 
^ aNumber adaptToInteger: self andSend: #+ 

- aNumber 
"Refer to the comment in Number - " 
aNumber isInteger ifTrue: 
    [self negative == aNumber negative 
     ifTrue: [^ self digitSubtract: aNumber] 
     ifFalse: [^ (self digitAdd: aNumber) normalize]]. 
aNumber isFraction ifTrue: 
    [^Fraction numerator: self * aNumber denominator - aNumber numerator denominator: aNumber denominator]. 
^ aNumber adaptToInteger: self andSend: #- 

を、私はそれを見るように、これは反対に完全ですものを設計するOOの方法は、一般的に悪いです。なぜ誰かがより良い解決策を見つけられないのですか?私は考えることができる

答えて

4

最も単純なものは次のとおりです。

- aNumber 
    ^self + aNumber negated 

しかし、これはコストを持っています:

  • 別の中間LargeIntegerの作成、または分数
  • さらに2つのメッセージはに送信します操作を実行する

私たちがここに見るのは、 mization。早すぎる最適化ではなく、これは広範囲に使用される低レベルの操作です。

isIntegerとisFractionの利用も同様に二重派遣
  • 方法のいくつかの種類にdigitAdd置き換えられるかもしれません
    • ::とdigitSubtract:仕事

      完璧ではない、このコード内の他のものがあります。完全な明示的な実装の詳細ではなく、コメントを付ける必要がある2の補数ではなく符号の大きさとして保存された整数の場合digit3dMagnitude:

  • 0

    It's OOに対してではなく、その動作はカプセル化されており、単純なAPIの背後にある複雑な動作を隠しています。 (またはSmalltalkで呼び出すようなメッセージプロトコル)。

    多くのコードの複製があります。インダイレクションの層を1つの共通の場所に置くことも可能ですが、これは速度のためのコンパクトさを犠牲にする例です。また、私はあなたの主な懸念であると信じているOnceAndOnlyOnceを犠牲にしてスピードを売買します。 (ParcPlaceの実装に基づいて、IIRC)

    Iが使用された最初のSmalltalkで

    LearningWorks-関数は、単に議論を否定した後+関数と呼ばれます。これにより、-の動作が+の動作よりも遅くなりました。

    ソフトウェア開発には多くのトレードオフと最適化があります - 主なものはメモリフットプリントのスピード(およびその逆)、開発スピードの実行速度(およびその逆)、何かを得ることの容易さ今すぐ働いていて、長時間にわたり微調整しています。

    OOの開発は一般に、開発のスピードを犠牲にして開発のスピードを最適化することで最適化され、開発が速いがゆっくり実行される高水準言語を使用して最適化されます。即時性より長期的な保守性を最適化する。できるだけ自然に遅いコードから多くのパフォーマンスを取り除くために大量のメモリを使用しています。

    しかし、これは一般化です。それらすべてに反例がありますが、私はかなり確信しています。

    関連する問題