亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

定義相似職責的接口

定義相似職責的接口

C#
慕村9548890 2021-04-05 21:22:13
假設我有一個interface ICanRotateWithinLimitedRange。有兩種方法可以指定對象可以旋轉的范圍:可以指定StartingAngle和EndingAngle?;蛘撸梢灾付⊿tartingAngle和RotationRangeInDegrees。(假設這些角度是相對于天頂定義的。)在這兩種情況下,StartingAngle都是必要的信息,此外還應指定EndingAngle xor RotationRangeInDegrees。我認為,ICanRotateWithinLimitedRange如下定義是錯誤的:public interface ICanRotateWithinLimitedRange{    float StartingAngle { get; }    float EndingAngle { get; }    float RotationRangeInDegrees { get; }}實際上應該有兩個接口,用于兩種可以指定旋轉范圍的不同方式。但是,該名稱ICanRotateWithinLimitedRange適用于兩個接口,因此如何適當命名接口以區分這兩個接口?
查看完整描述

2 回答

?
慕姐4208626

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);

}

那代表了旋轉的實際能力。


查看完整回答
反對 回復 2021-04-17
?
翻過高山走不出你

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為計算所得的屬性,而不是在構造函數中對其進行計算。

這里有許多可能的變化。我試圖堅持使用接口(您已經在使用它)的簡單明了的接口。


查看完整回答
反對 回復 2021-04-17
  • 2 回答
  • 0 關注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號