簡體   English   中英

代碼樣式:“隱藏”數據類型(Java)

[英]Code style: “hiding” data types (Java)

我正在研究一組課程來表示音符,小節,節奏等。 當然,我將不得不處理最好用分數表示的時間簽名(如4 / 4,3 / 4等)。

我想知道什么是更好的風格。 使用Bar的構造函數包含Fraction-object或僅包含兩個int作為時間簽名。

public Bar(Fraction timeSignature) {
    this.timeSignature = timeSignature;
}

要么:

public Bar (int num, int den) {
    timeSignature = new Fraction(num, den);
}

我的意思是......我可以同時擁有這兩個但我應該在申請中選擇哪一個? 是否有“更好”的風格?

謝謝你的想法!

就個人而言,我會選擇第一種方法。 如果你知道你需要/想要一個Fraction對象,為什么Bar不僅僅是那個? 調用Bar類的人需要以任何方式理解Fraction(向你傳遞整數),所以它更干凈。

我將使用第一個並在fraction類中提供一個工廠方法,以便能夠調用類似於:

new Bar(Fraction.of(4, 4));

兩全其美;-)

首先,簡單的API很好,是的,但是如果稍后擴展構造函數以獲取更多參數(比如BPM),則使用基元而不是對象會使調用代碼更難理解。 即:

Bar myBar = new Bar(4, 4) // Okay
Bar myBar = new Bar(4, 4, 120) // ??
Bar myBar = new Bar(new TimeSignature(4, 4), 120) // Much clearer

如果有疑問,明確表示更好。

其次,我想說不要將時間簽名存儲在Fraction對象中 - 雖然它們通常被寫成分數,但時間簽名卻不是。 3/4和6/8相當於分數,但是不同的時間簽名會產生不同的聲音。 TimeSignature屬於您的程序域,它保證自定義類型。

您可能需要考慮將時間簽名設置為枚舉,以防止用戶輸入錯誤。 由於您可能擁有一組有限的時間簽名(2 / 4,6 / 8,4 / 4),因此您可以通過執行以下操作來控制用戶創建的時間簽名:

//example
new Bar(TimeSignature.DUPLE_2_2)

public enum TimeSignature{

DUPLE_2_2(2,2), QUADRUPLE_2_4(2,4), TRIPLE_3_4(3,4);

private final int numerator;
private final int denominator;

private TimeSignature(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}


}

祝好運

與每個設計問題一樣,這取決於。 在這種情況下,您應該考慮如何使用您的課程。

一般來說,我更喜歡更簡單的API。 比較一下:

Bar myBar = new Bar(4, 4);

對此:

Bar myBar = new Bar(new Fraction(4,4));

后一種選擇更明確(這很好),但如果用文字參數實例化很多條形,可能會變得乏味。 另一方面,如果你的代碼需要處理分數,第一種語法可能會更好。

另一個需要考慮的方面是引入新類Fraction的開銷。 創建一個額外的類只是為了存儲兩個int意味着很多開銷很少使用。 但是,如果Fraction提供其他服務(例如分數的簡化),則該類獲得其存在的權利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM