質問

私は今、学校でプログラミングとソフトウェアデザインとJavaを学んでいます。私を混同しているクラスはソフトウェア設計です。単語を使用して簡単なVBコードを実行して、簡単なプログラムを実行しています。私のインストラクターは、合計を実行することで結束を失っていると言います。私はそれらを避ける方法を考えるのに苦労しています。以下は、私が話しているいくつかの擬似コードの例です(モジュールは、表示されていないドライバーモジュールの形式と呼ばれます):

CaluculateDiscountPrice module
    DiscountPrice = (FloorPrice * (1 – DiscountRate))
End module

CalculateDeliveryPrice module
    If DeliveryFee = “Yes” Then
        DeliveryPrice = DiscountPrice + 20  
    ElseIf DeliveryFee = “No” Then
        DeliveryPrice = DiscountPrice
    End If
End module

CalculateTradeInCredit module
    If TradeInCredit = “Yes” Then
        CreditedPrice = DeliveryPrice – 5
    ElseIf TradeInCredit = “No” Then
        CreditedPrice = DeliveryPrice
    End If
End module

CaluculateCostOfBed module
    CostOfBed = CreditedPrice
End module

基本的に DiscountPrice 最初の2つのモジュールに参加してから使用してから DeliveryPrice 2番目の2つ。おそらく、最後のモジュールは、この問題を修正したことです。初心者に何か助けがありますか?

役に立ちましたか?

解決

私があなたの例を見るとき、私に飛び出すのは問題です カップリング モジュール間。 (そのコンセプトをまだ勉強していない場合は、おそらくすぐにそうします。)しかし、結合が多すぎて結束が少なすぎることが多いことが多いので、うまくいけば役立つ答えを出すことができます。 (単純化されているが適切な定義:凝集性モジュールは、いくつかの無関係なことではなく、1つの集中的なことを行い、結合モジュールは互いに依存して、それが何をするかを行うために依存しています。他のモジュール。)

私はあなたの擬似コードから、あなたがそうするようなベッドの価格を計算したいと推測します:

* start with the floor price
* discount it
* add in a delivery fee
* subtract a trade-in credit
* the result is the cost of the bed

あなたがそのようにそれを表現するとき、あなたはそれらの操作が互いにかなり独立している(または可能性がある)ことに気付くかもしれません。たとえば、配送料は実際には割引価格に依存するものではなく、配送料が請求されるかどうかだけです。

今、あなたがあなたのデザインを構成した方法、あなたの「配信プライス」変数は本当に「配信された」価格です します 割引価格に依存します。これは私たちが取り除きたいことのようなものです。あなたのモジュールは、問題を解決するために本当に必要ではない方法で互いに依存しているため、強く結合しすぎていると言えます。彼らは本当に複数のことをしているので、それらはまとまりがないと言うことができます - すなわち、配達価格モジュールは 割引価格に配送料を追加します ただの代わりに 配送料の計算.

おもちゃの例では見るのは難しいですが、これはデザインがより複雑になるにつれて重要です。ほんの数行の擬似コードで、それらの間に「実行されている合計」がねじ込まれているのは完全に自然なようです。しかし、配送料が顧客の家までの距離、購入の重量、曜日に関係する複雑な計算に依存している場合はどうなりますか?今、それを持っています また 割引価格が本当に混乱するものは何でも関与してください。

したがって、すべてを念頭に置いて、この代替デザインを考慮してください。

CalculateDeliveryFee module                                  
    If DeliveryFeeCharged = “Yes” Then                                  
        DeliveryFee = 20                                    
    End If                                  
End module                                  

CalculateTradeInCredit module                                  
    If TradeInCreditApplied = “Yes” Then                                  
        TradeInCredit = 5                                  
    End If                                  
End module                                  

CaluculateCostOfBed module 
    DiscountPrice = (FloorPrice * (1 – DiscountRate))  
    AsDeliveredPrice = DiscountPrice + DeliveryFee   
    WithTradeInPrice = AsDeliveredPrice - TradeInCredit                             
    CostOfBed = WithTradeInPrice 
End module                                  

現在、カップリングが削減されます - 配信とトレードインモジュールは、ベッドの価格についてまったく何も知りません。また、これは彼らの結束を改善します。なぜなら、彼らはより焦点を絞った何かをしているからです - 価格や料金を合計するのではなく、料金の計算を計算します。実際の価格計算は他のモジュールに依存しますが、それは問題に固有のものです。そして、計算はまとまりがあります - それがしている「一つのこと」はベッドの価格を計算することです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top