你定義的類似乎更像值的隨機抓鬥袋,而不是像一個明確的類。所有這些值實際上代表什麼?
public string StartYear;
public string EndYear;
public string Year;
public DateTime StartDate;
public DateTime EndDate;
public string StartMonth;
public string EndMonth;
public DateTime StartDay;
public DateTime EndDay;
例如,是什麼StartDate
和StartDay
之間的區別? StartYear
和StartMonth
是什麼?這個課程實際上是什麼定義?它看起來像是在試圖將DateTime
值分解爲組件。你不需要那樣做。一個簡單的DateTime
值足夠存儲必要的信息,你可以直接從該值獲得的組件:
public DateTime StartDate;
public DateTime EndDate;
如果您需要知道一個月,例如,您可以從價值得到它:
myObject.StartDate.Month;
要繼續改進班級,您需要使用屬性而不是公共成員。在C#中,這些將如下所示:
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
這些被明確稱爲自動實現的屬性。它們是完整屬性的編譯器:
private DateTime _startDate;
public DateTime StartDate
{
get { return _startDate; }
set { _startDate = value; }
}
// repeat for EndDate
屬性的好處是該類對內部結構的影響較小。如果您需要爲類添加任何邏輯(例如檢查日期的特定邊界,例如確保過去沒有StartDate),則可以將其添加到屬性中,而不會破壞類的二進制兼容性。因此,消費代碼永遠不需要知道差異。例如:
private DateTime _startDate;
public DateTime StartDate
{
get { return _startDate; }
set
{
if (value < DateTime.Now)
throw new ArgumentException(string.Format("Start Date must not be in the past: {0}", value.ToString()));
_startDate = value;
}
}
通過繼續定義此類的行爲,您可以繼續更進一步。即使將這些屬性暴露出來,仍然使該類更像是「數據結構」而不是「對象」。 (爲了進一步閱讀關於數據/對象的反對稱性,我建議Robert Martin推薦Clean Code。)適當的面向對象設計的目標是讓對象隱藏其數據並公開內部對該數據執行有狀態操作的方法。
例如,如果您需要按天延長EndDate
,你可以這樣做:
myObject.EndDate += new TimeSpan(1, 0, 0, 0);
但是,一個更加面向對象的方法(與堅持「告訴,不要問」校長)將告訴物體本身延長時間,而不是直接告訴其數據延長時間(從而在過程中「詢問」物體的數據,這可能也違反了德米特定律):
myObject.ExtendEndDate(new TimeSpan(1, 0, 0, 0));
myObject.ExtendEndDate(new TimeSpan(1, 0, 0, 0));
或甚至:
myObject.ExtendEndDateInDays(1);
你只需要實現在對象上這樣的方法,並且該方法將內部延長EndDate
值。
該類本身應該封裝它所表示的概念所需的所有功能。如果絕對必要,它可以爲其內部成員提供公共讀取權限,但從設計角度來看,值得問問自己究竟需要針對對象的數據確定哪種查詢,併爲這些查詢提供更有針對性的方法,而不是直接訪問給班級的數據成員。
任何財產我有點不確定global'的'在* PHP的內部運作* ,但'公共靜態'是* C#*中的正確替代*我相信。並已被指出爲答案,如果可能的話使用屬性而不是字段。 Ex'公共靜態字符串StartMonth {get;設置;}' – flindeberg