ASP.NET Object Oriented Programming 物件導向程式開發筆記

2021-06-09

筆記關於 ASP.NET 物件導向開發的常見的名詞與使用情境

logo

說明

物件導向的程式設計,是以物件的互動的方式進行開發,可以提升程式的可維護性,對於複雜與大規模的系統開發有著更好的管理。

物件導向設計與資料庫的設計息息相關,都是從需求到建立抽象化模型的過程。而該如何識別類別,可以從需求情境中,找出名詞關鍵字作為實體,動詞作為方法建構出類別。在類別設計上,需要注意切割責任,保持類別的單一功能,將客戶的地址由 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}";
}
屬性通常會與驗證做結合,在 ASP.NET MVC 框架中,搭配 DataAnnotations 設定屬性的規範,可以在使用 EntityFramework 時自動進行檢查,同時也將檢查的設定做關注點的分離,非常方便。

多載 Overload

函式可以同名,但藉由簽名(由參數的型別、順序、數量所構成)的不同提供使用上的便利性,在不同的使用情境選擇使用。

同時多載函式也可以作為對於執行期間的邏輯控制。然而參數過多的 Primitive Variable 會變得不容易閱讀,應該用 Class 作為裝載參數。

在 ASP.NET MVC 框架中,不論是 Html Helper 或者 Url Helper 都有提供多載,在創造 Html Tag 上具有極佳的彈性。

建構子 Constructor

建構子可以定義物件被建立時,建立當下要進行的步驟,通常是為屬性進行賦值。建構子本身也可以 Overloadding ,依照使用情境提供不同的參數進行建立。

在 MVC 的 Controller 中,如果有共通的 ViewBag 值需要設定,可以創造該 Controller 的建構子,這樣所有的 Action 都會有建構子的設定。

覆寫 Override

類別可以覆寫所繼承(Inherit)或者所實作介面(Implement Interface)的屬性與方法,未被覆寫的內容達到程式碼重複使用的便利,覆寫的內容則提供了程式設計與擴充上的彈性。

覆寫可以針對類別(Class)、抽象類別(Abstract Class)與介面(Interface)中的屬性或方法進行覆寫,允許被覆寫的屬性與方法須明確以 Virtual 修飾,否則預設都是不可被子類別複寫的 Sealed 修飾。抽象類別的方法與屬性則是以 Abstract 進行修飾。

MVC 提供了許多可供覆寫的元件,許多機制的客製化,就是實作介面並覆寫方法,例如 Filter、Route Handler。

物件的關係 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

MVC 中常見的 Interface : IActionFilter、IDisposable

靜態修飾 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#

相關連結

Course Review - C# Intermediate Classes, Interfaces and OOP

Visual Studio 入門教學