筆記關於 ASP.NET 物件導向開發的常見的名詞與使用情境
說明
物件導向的程式設計,是以物件的互動的方式進行開發,可以提升程式的可維護性,對於複雜與大規模的系統開發有著更好的管理。
物件導向設計與資料庫的設計息息相關,都是從需求到建立抽象化模型的過程。而該如何識別類別,可以從需求情境中,找出名詞關鍵字作為實體,動詞作為方法建構出類別。在類別設計上,需要注意切割責任,保持類別的單一功能,將客戶的地址由 primitive type(string) 獨立為 Class,讓基於地址的資料(zipCode, city, street..)與方法由類別負責。
屬性 Property
屬性是公開面對外界的物件資料,依據情境可以提供 getter / setter 或只提供 getter。屬性背後指向的仍是 Field,而 Field 是封裝在物件之中不提供外界直接存取。藉由 Property 可以從 Field 衍生多種資料。
例如 Birthdate Field 可以衍生為 Age Property;Last Name 與 First Name Field 可以衍生為組合再一起的 FullName。
public class Person
{
private DateTime _birthDate;
public int Age => (DateTime.Now - _birthDate).Days / 365;
private string _lastName;
private string _firstName;
public string Name => $"{_firstName}, {_lastName}";
}
多載 Overload
函式可以同名,但藉由簽名(由參數的型別、順序、數量所構成)的不同提供使用上的便利性,在不同的使用情境選擇使用。
同時多載函式也可以作為對於執行期間的邏輯控制。然而參數過多的 Primitive Variable 會變得不容易閱讀,應該用 Class 作為裝載參數。
建構子 Constructor
建構子可以定義物件被建立時,建立當下要進行的步驟,通常是為屬性進行賦值。建構子本身也可以 Overloadding ,依照使用情境提供不同的參數進行建立。
覆寫 Override
類別可以覆寫所繼承(Inherit)或者所實作介面(Implement Interface)的屬性與方法,未被覆寫的內容達到程式碼重複使用的便利,覆寫的內容則提供了程式設計與擴充上的彈性。
覆寫可以針對類別(Class)、抽象類別(Abstract Class)與介面(Interface)中的屬性或方法進行覆寫,允許被覆寫的屬性與方法須明確以 Virtual 修飾,否則預設都是不可被子類別複寫的 Sealed 修飾。抽象類別的方法與屬性則是以 Abstract 進行修飾。
物件的關係 Relationship
USE-A
類別之間是使用關係,例如在任務類別中啟用了一個計時器的類別。
public class Calculator
{
public void Caculate()
{
var timer = new Timer();
...
}
}
public class Timer
{
public DateTime Time { get; set; }
}
HAS-A
類別之間是擁有關係,例如計算機類別擁有一個 CPU 類別。
public class Calculator
{
public string Name { get; set; }
public CPU ComputeChip { get; set; }
}
public class CPU
{
public string Model {get; set; }
}
IS-A
類別之間是繼承關係或者實作關係,因此可以使用物件導向中多型 (Polymorphism) 的功能。
public class Calculator : IComputable
{
public string Name { get; set; }
public CPU ComputeChip { get; set; }
public void Compute()
{
...
}
}
public class Calculator : Object
{
public string Name { get; set; }
public override string ToString()
{
return base.ToString();
}
}
介面 Interface
靜態修飾 Static
static 可以用於修飾 Class 形成靜態類別,或者是修飾類別中的屬性與方法。
靜態類別的特性是無法實體化,且其成員(屬性與方法)都被須為 static 修飾,而靜態類別的屬性與方法可以直接被呼叫。
public static class HelperMethod
{
public static int SquareSum(int x, int y) => x * x + y * y;
}
static void Main()
{
Console.WriteLine(HelperMethod.SquareSum(1, 5)); //26
}
一般類別中的靜態屬性或靜態方法,不是保存在個別的實體化物件之中,而是保存在類別之中,只會有一份資料,可以用於類別與其物件管理上的用途。
public class Person
{
public static int Count{ get; set; }
public string Name { get; set; }
public Person()
{
Count += 1;
}
public static int PersonNumbers { get { return Count; } }
}
static void Main()
{
var p1 = new Person() { Name = "Javis" };
var p2 = new Person() { Name = "Ted" };
Console.WriteLine(Person.PersonNumbers); //2
}
參考資料
Object-Oriented Programming Fundamentals in C#