2 回答

TA貢獻1852條經驗 獲得超7個贊
尚不清楚為什么這是一個接口。它代表有效旋轉的范圍,而不是旋轉任何東西的能力。接口通常最能代表功能,而不僅僅是數據對象,IMO。很難看到這里所表示的數據如何有多種有用的表示形式。
以任何一種形式創建的旋轉都可以表示所有三個值,因此我只需要編寫帶有工廠方法的單獨的類或結構來表示兩種不同的創建實例的方式:
// Note: You may well want to make this a struct instead.
public sealed class RotationRange
{
public float Start { get; }
public float End { get; }
public float Range => End - Start;
private RotationRange(float start, float end)
{
Start = start;
End = end;
}
public bool IsValid(float angle) => angle <= Start && angle < End;
public static RotationRange FromStartAndEnd(float start, float end) =>
new Rotation(start, end);
public static RotationRange FromStartAndRange(float start, float range) =>
new Rotation(start, start + range);
}
該名稱可能需要改變-這不是完全清楚怎么在這里的意思......它可能是Start和End真正應該MinimumAngle和MaximumAngle例如,它的奇使用Range的范圍的長度和范圍本身。您可能還需要添加單位。(您的問題中具有“學位”,但僅適用于一種性質,而大概適用于所有這些性質。)
哦,您可能想進行一堆驗證:)
您可能有一個單獨的接口,該接口使用該類作為參數或返回值。例如:
public interface IRotatable
{
RotationRange RotationRange { get; }
// This must be valid according to RotationRange
void Rotate(float angle);
}
那代表了旋轉的實際能力。

TA貢獻1875條經驗 獲得超3個贊
有兩種方法可以指定對象可以旋轉的范圍
我將假設一個人總是可以在這兩種方法之間進行選擇。
執行旋轉(Rotate())的方法應獨立于允許旋轉的參數。
注意:當然,從某種意義上講它是相關的,因為它知道在哪里可以找到所需的參數,但是該方法應該可以與用戶選擇的兩個參數集中的一個無關。
因此,該輪換具有簡化的簽名:
public void Rotate(IRotationParameters parameters)
這使您能夠開發方法主體而無需關心如何定義參數。
隨著方法主體的發展,挑戰就變成了定義參數(任一種方式)。
由于您已經在使用接口,因此讓我們擴展該方法:
publc interface IRotationParameters
{
float StartingAngle { get; }
float EndingAngle { get; }
float RotationAngle { get; }
}
假設任何一個IRotationParameters都將始終暴露所有三個變量,那么您將始終能夠實現輪換(無論如何)。
假設我們有三個開發人員,每個開發人員都喜歡一種特定的輪換方法。
開發人員A首選此start+angle方法。
開發人員B更喜歡這種start+end方法。
開發該Rotate()方法的Dev C具有未知的偏好。
如何滿足開發人員A:
使用此類:
public class RotationParametersFromStartAndAngle : IRotationParameters
{
public float StartingAngle { get; private set; }
public float EndingAngle { get; private set; }
public float RotationAngle { get; private set; }
public RotationParametersFromStartAndAngle(float start, float angle)
{
this.StartingAngle = start;
this.RotationAngle = angle;
this.StartingAngle = start + angle;
}
}
如何滿足開發人員B:
使用此類:
public class RotationParametersFromStartAndEnd : IRotationParameters
{
public float StartingAngle { get; private set; }
public float EndingAngle { get; private set; }
public float RotationAngle { get; private set; }
public RotationParametersFromStartAndEnd (float start, float end)
{
this.StartingAngle = start;
this.StartingAngle = end;
this.RotationAngle = end - start;
}
}
如何滿足開發人員C:
開發人員C將始終感到滿意,因為IRotationParameters這兩種方法都可以為您提供便利。他可以隨心所欲地開發自己的方法(即使他是一個怪人,他也認為應該使用第三種“角度+末端”方法)。
評論
我使用了兩個不同的參數類。您還可以將單個類與兩個靜態“構造”方法一起使用。這樣就不需要接口了,因為您只使用一個類。
您可以具有一個EndingAngle或RotationAngle為計算所得的屬性,而不是在構造函數中對其進行計算。
這里有許多可能的變化。我試圖堅持使用接口(您已經在使用它)的簡單明了的接口。
- 2 回答
- 0 關注
- 173 瀏覽
添加回答
舉報