1

私は今、学校でプログラミングとソフトウェア設計とJavaを学んでいます。私を混乱させているクラスはソフトウェアデザインです。Wordを使用して単純な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つのモジュールを結合するために使用されます。おそらく、最後のモジュールが存在する必要さえないかもしれませんが、私はこの問題を修正しました。初心者に何か助けはありますか?

4

1 に答える 1

1

私があなたの例を見るとき、私に飛び出すのはモジュール間の結合の問題です。(まだその概念を勉強していない場合は、おそらくすぐに勉強します。)ただし、結合度が高すぎたり、凝集度が少なすぎたりすることがよくあるので、役立つ回答を提供できることを願っています。(過度に単純化されていますが、ここでは適切な定義:凝集モジュールは、いくつかの無関係なことではなく、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

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

これで、デザインを構造化した方法で、「DeliveryPrice」変数は実際には「配信時」の価格であり、割引価格に依存します。これは私たちが取り除きたい種類のものです。モジュールは、問題を解決するために実際には必要とされない方法で相互に依存しているため、緊密に結合されていると言えます。彼らは実際に複数のことをしているので、彼らはまとまりがないと言うことができます-つまり、配送料モジュールは、配送料を計算するだけでなく、割引価格に配送料を追加しています。

おもちゃの例ではわかりにくいですが、デザインが複雑になるにつれて、これは重要になります。数行の擬似コードだけで、それらの間に「現在の合計」をスレッド化するのは完全に自然なようです。しかし、配送料が顧客の家までの距離、購入の重量、曜日などの複雑な計算に依存している場合はどうなるでしょうか。さて、それを持っていることは、割引価格が本当に混乱するであろうものは何でも含みます

したがって、これらすべてを念頭に置いて、この代替設計を検討してください。

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                                  

これで、結合が減ります。配送モジュールと下取りモジュールは、ベッドの価格について何も知りません。これはまた、彼らがより焦点を絞った何かをしているので、彼らの結束を改善します-価格と料金を合計するのではなく、料金を計算します。実際の価格計算は他のモジュールに依存しますが、それは問題に固有のものです。そして、計算はまとまりがあります-それがしている「1つのこと」はベッドの価格を計算することです!

于 2010-08-13T15:41:41.803 に答える