iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

Low cohesion的說明

  • 一個類別或模組的職責太多, 或者它的函數之間沒有緊密的關係
  • 低內聚的類別群, 會讓開發者難以理解與維護
    • 因為它們執行不相關的任務
  • 導致程式碼容易出錯、更難測試

High cohesion的說明

  • 一個類別或模組, 具有一組定義明確、重點明顯的職責
    • 它的函數都與此職責有相關
  • 高內聚的程式碼容易理解、維護與測試
    • 因為每個類別或模組都有具體的用途
  • 高內聚有助於建立乾淨的模組化程式碼

Low cohesion範例

假設有個學生類別, 目前它有很多的函式:

public class Student
{
    public string Name { get; set; }
    public int StudentId { get; set; }
    public Department Department { get; set; }
    public Student(string name, int studentId, Department department)
    {
        Name = name;
        StudentId = studentId;
        Department = department;
    }

    public void CalculateTuitionFee()
    { 
        // Tuition fee calculation logic
    }

    public void GenerateTranscript()
    { 
        // Transcript generation logic 
    }

    public void SaveToDatabase()
    { 
        // Database save logic 
    }

    public void SendEmail()
    { 
        // Email sending logic
    }
}
  • 上述程式碼, Student類別有太多不相關的職責
    • Data Storage
      • 有學生的ID、名字和系所
    • Tuition fee calculation
      • 計算學生的學費
    • Transcript generation
      • 產生學生成績單
    • Database interaction
      • 儲存學生的資料到資料庫
    • Email sending
      • 寄email
  • 低內聚的問題
    • 維護變難
      • 可能改A區塊的邏輯而不小心異動到B區塊的邏輯, 難以查找
    • 降低重用性
      • 會低重用性通常是高耦合, 難以拆解可重用模組
    • 測試變難
      • 為了要測試得設置很多不相關的參數、環境

High cohesion

  • 為了達到高內聚, 而是做重構, 將分成各自單一職責的類別.
  • 以前面的學生範例, 從學費計算到寄email, 都能移到獨立的類別.
public class Student
{
    public string Name { get; set; }
    public int StudentId { get; set; }
    public Department Department { get; set; }
    public Student(string name, int studentId, Department department)
    {
        Name = name;
        StudentId = studentId;
        Department = department;
    }

    public void CalculateTuitionFee()
    {
        // Tuition fee calculation logic
    }

    public void GenerateTranscript()
    {
        // Transcript generation logic 
    }

    public void SaveToDatabase()
    {
        // Database save logic 
    }

    public void SendEmail()
    {
        // Email sending logic
    }
}

public class TuitionFeeCalculator
{
    public decimal CalculateTuitionFee(Department department)
    {
        // Tuition fee calculation logic
        // ...
    }
}

public class TranscriptGenerator
{
    public void GenerateTranscript(Student student)
    {
        // Transcript generation logic
        // ...
    }
}
public class DatabaseService
{
    public void SaveStudentToDatabase(Student student)
    {
        // Database save logic
        // ...
    }
}
public class EmailService
{
    public void SendEmail(string recipient, string sender, string message)
    {
        // Email sending logic
        // ...
    }
}

上一篇
Clean Code 第1章 - 無暇的程式碼
下一篇
Coupling 耦合
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言