2013-07-03 85 views
2

例如,我需要計算的牛頓定律F = MA的功能,所以我的代碼下面的C#的數學公式設計模式

private double calcForce(double mass, double acceleration){ 
     return mass * acceleration; 
} 

private double calcMass(double force, double acceleration){ 
     return force/acceleration; 
} 

private double calcAcceleration(double force, double mass){ 
     return force/mass; 
} 

能正常工作,如果數學函數有少量的變量( F = MA只有3),具有更復雜的功能(我真正的任務是處理熱傳遞/流體力學函數,它很容易包含超過10個變量!)方法數將等於該數學函數中的變量數。

那麼,有沒有什麼好的設計模式來照顧到這一點。我應該使用這樣的東西嗎?

private double NewtonsLaw(double? force,double? mass,double? acceleration) 
{ 
     if(!force.HasValue) 
      return mass*acceleration; 
     //else if 
} 

還有一件事,我需要在objective-c和java代碼而不是C#代碼。

回答

0

一種方式做到這一點是創建與質量/加速/力值的對象和(取決於值設置),要麼計算它們或只返回他們

public class NewtonLaw { 
    private Double mass; 
    private Double acceleration; 
    private Double force; 

    public NewtonLaw(Double mass, Double acceleration, Double force) { 
     this.mass = mass; 
     this.acceleration = acceleration; 
     this.force = force; 
    } 

    public Double calcMass() { 
     if (mass != null) { 
      return mass; 
     } else if (acceleration == null) { 
      throw new IllegalStateException("Acceleration is not set"); 
     } else if (acceleration == 0) { 
      throw new IllegalStateException("Acceleration is zero, cannot calculate the mass"); 
     } else if (force == null) { 
      throw new IllegalStateException("Force is not set"); 
     } else { 
      return force/acceleration; 
     } 
    } 

    public Double calcAcceleration() { 
     if (acceleration != null) { 
      return acceleration; 
     } else ... 
    } 

    public Double calcForce() { 
     if (force != null) { 
      return force; 
     } else ... 
    } 
} 

誠然,這是一個很多的代碼只是一些計算,但至少邏輯是完全封裝在對象中

0

我認爲最好有一個單獨的方法爲每個可能的組合,而不是讓用戶傳遞可空類型的一個值設置爲null 。

如果您提供了一個私有構造函數,它接受所有值和一組公共靜態工廠方法,每個方法都接受除一個值之外的所有值,它將使代碼在調用點更清晰,並且還意味着你不需要檢查除了一個值之外的所有值都是非空的。

像這樣的東西(在C#編寫,但這個概念轉換爲Java或目標C容易夠):

public class Newton 
{ 
    readonly double _force; 
    readonly double _mass; 
    readonly double _accel; 

    public double Force 
    { 
     get { return _force; } 
    } 

    public double Mass 
    { 
     get { return _mass; } 
    } 

    public double Accel 
    { 
     get { return _accel; } 
    } 

    public static Newton FromForceAndMass(double force, double mass) 
    { 
     return new Newton(force, mass, calcAccel(force, mass)); 
    } 

    public static Newton FromForceAndAccel(double force, double accel) 
    { 
     return new Newton(force, calcMass(force, accel), accel); 
    } 

    public static Newton FromMassAndAccel(double mass, double accel) 
    { 
     return new Newton(calcForce(mass, accel), mass, accel); 
    } 

    private static double calcAccel(double force, double mass) 
    { 
     return force/mass; 
    } 

    private static double calcForce(double mass, double acceleration) 
    { 
     return mass * acceleration; 
    } 

    private static double calcMass(double force, double acceleration) 
    { 
     return force/acceleration; 
    } 

    private Newton(double force, double mass, double accel) 
    { 
     _force = force; 
     _mass = mass; 
     _accel = accel; 
    } 
} 

(該值不爲零檢查司 - 你必須添加錯誤檢查。對於)

然後在那裏你怎麼稱呼它,發生了什麼事是比較明顯的:

var newton = Newton.FromForceAndAccel(1.234, 6423.2); 

這不會單獨方法的數量有所幫助,但它有一個很好的美國ge模式。

0

無論你將使用什麼樣的模式,你將不得不編碼你的新值的計算。所以這意味着至少有10個公式適用於你的傳熱/流體力學問題。

把所有與可選參數的相同方法的是一個壞主意,因爲它會讓你的代碼更復雜(那麼多的錯誤,難以維護等)。此外,你可能在你的論點順序上是錯誤的,然後計算出與你的東西不同的東西(你認爲計算質量,但是你正在計算加速度)。

最好用單獨的方法封裝這10個公式。它將更容易實現任何錯誤檢查/處理,並且更易於調試,測試和維護。現在

,您可以封裝在一個對象的10種方法,將爲您提供可方便用於自己使用的接口。以前的評論包含很好的想法選一個適合你的。