Brian的雜記
  • Introduction
  • Brian's 雜記
    • My Awesome API
    • FB 大頭貼
    • 硬體雜記
    • PHP
    • project
      • 模擬器
      • WAMP
    • WinMerge
    • 雜記
      • LINQ
      • 方法
      • Grid View
      • namespace
      • global
      • 物件導向
      • Excel
      • VS2017
      • single sign on
      • Master
      • Https
      • 憑證
      • 略過憑證不符
      • NLog
      • 團隊開發
      • .NET Core
      • 共用網路上的芳鄰
      • 爬蟲
      • NPOI
      • RSS
      • 多執行緒
      • 記憶體回收
      • 密碼學
        • BCrypt
        • AES
      • 主機環境建置
      • Session
      • Error
      • IIS 相關
      • 無障礙相關
      • 介面
        • 影像地圖
      • telnet
        • smtp
      • nslookup
      • 協助客戶解決問題
      • 驗證欄位
      • 網站管理
      • 工具整理
    • 正規表示法
    • 影像處理
    • IntelliJ Idea
    • 觀念
      • Clean Code
        • 命名
        • 函式
        • 註解
        • 編排
        • 物件及資料結構
        • 錯誤處理
        • 邊界
        • 單元測試
        • 類別
      • Java 程式風格
      • Design Pattern
        • 單例模式
      • 同步
      • 畫圖
        • ER-Model
        • 類別圖
        • Use Case
        • 有限狀態機
      • 資料 API 文件 分析
      • CORS & SSL
      • 利用DISC幫助溝通
      • OAS
    • 檔案上傳
      • FileStore
      • App Engine
      • Google Storage
    • OAuth vs Open ID
    • MIME
    • 虛擬桌面
    • 待看資料
    • Selenium
    • CDN
    • HTTP
    • 編碼
    • 2nd-ML100Days
      • jupyter
    • 微服務
      • 設計
        • 1 ~ 5
        • 6
        • 7
        • 8
        • 9
    • Gradle
    • Maven
    • Error
    • 批次檔 BAT
    • Kurento
    • WebSocket & WebRTC
  • 需求面能力
    • User Story
  • Google Cloud Platform
    • Compute Engine
  • Python
    • 基本語法
    • Pandas
    • 套件
    • Matplotlib
    • Encoder
    • jupyter
  • Java
    • Java
      • File
      • Exception
      • 物件導向觀念
      • 加密
      • HTTP
      • 集合
      • Stream()
      • Web
      • ResultSet
      • JDK6
      • JDK8
    • 讀取、複寫MP3 Tag
    • Log4j2
    • Servlet
      • 容器
    • JSP
    • JBOSS
    • JWT
    • PreparedStatement
    • Error
    • Spring
      • Spring Boot
        • @Value
        • Build
      • RequestParameter
      • Error
      • Autowired
      • JPA
      • FeignClient
      • WebSocket
      • thymeleaf
      • Security
      • Test
      • Scheduled
      • Redirect
    • IntelliJ
  • Linux
    • Linux
    • Shell Script
    • Cygwin(在Windows執行Linux指令)
  • 前端
    • HTML
      • Link
    • CSS
      • Position
      • padding color
      • display
    • JS
      • jQuery
        • Select2
      • fancybox
      • ES6
      • 效能
      • GoogleMap API
        • Marker
        • InfoWindow
      • 事件
      • CKEditor
      • TGOS
      • JSON
      • QRcode
      • 核心概念
        • 物件 變數 型別
          • number
          • String
          • boolean
          • null & undefined
          • Symbol
        • JS 物件概念
        • 深入理解JS 函式物件
        • 更多ES2015/ES6 全新語言特性
      • Promise
    • 效果應用
  • 資料庫
    • 注意事項
    • MariaDB
    • MySQL
      • inner join 和 join
      • 字串比對
      • 倒數資料
    • SQL
      • DDL 資料定義語言
      • DML 資料操縱語言
      • DCL 資料控制語言
      • TCL 交易控制語言
      • T-SQL
      • CTE
      • JOIN
    • Oracle
    • MSSQL 操作
      • 新增使用者
      • SQL 指令
      • Sequence
    • 差異比較
    • MyBatis
    • Workbench 操作
    • SQL Injection
  • 版本控制
    • Gitlab
      • sign up
      • sign in
      • add project
      • add members
    • SourceGit
      • install
    • SmartGit
      • install
      • operate
      • git 操作雜記
    • TortoiseGit
    • Git
    • TFS
    • SVN
  • Test
    • 軟體測試原則
    • 演算法
    • XMind
      • install
    • Jenkins
      • 建置
    • HTTPie
    • Postman
    • 測試驅動開發
    • 撰寫測試的觀念
    • 測試框架
    • IoC & DI
    • 隔絕相依性的方式
    • JUnit
    • NUnit
    • 習慣
    • 虛設常式
  • Angular
    • hello world
    • ng-options
    • ES6
    • Build & Conponect
    • HttpClient
    • 部署
  • ASP.NET Web Form
    • Chapter 2
      • 2-1
        • 小東西
    • 略過請求驗證
  • Go
Powered by GitBook
On this page
  • 物件及資料結構
  • 德摩特爾法則(The Law of Demeter)
  • (火車事故)
  • (混合體)
  • 隱藏結構
  • 資料傳輸物件(Data Transfer Objects, DTO)
  • 活動紀錄(Active Records)
  • 總結

Was this helpful?

  1. Brian's 雜記
  2. 觀念
  3. Clean Code

物件及資料結構

物件及資料結構

結構化的程式碼(使用資料結構的程式碼)容易添加新的函式,而不需要變動已有的資料結構。

而物件導向的程式碼,容易添加新的類別,而不用變動已有的函式。

也可以反過來說:

結構化的程式碼難以添加新的資料結構,因為必須改變所有的函式。

物件導向的程式碼難以添加新的函式,因為必須改變所有的類別。

因此,使用物件導向感到困難的事物,在結構化裡卻比較容易。 使用結構化感到困難的事物,在物件導向卻比較容易。

讓每一件事物都是一個物件是一個神話。

某些時候,你真的只想使用簡單的資料結構,並透過結構式的程式碼來操作這些資料結構。

德摩特爾法則(The Law of Demeter)

模組不該知道關於它所操縱物件的內部運作。

一個類別C 內的方法f ,應該只能呼叫以下事項。

1.C 2.任何由f 產生的物件 3.任何當作參數傳遞給f 的物件 4.C類別裡實體變數所持有的物件

例如以下的程式碼就違反了此法則。

String str = ctxt.getA().getB().getC();

(火車事故)

上面的程式碼串起來,像火車車廂一樣,所以通常被稱呼為火車事故(train wreck)。

比較好的做法應該是

A a = ctxt.getA();
B b = a.getB();
String str = b.getC();

至於這樣算不算是違反德摩特爾法則,要取決於他們是物件還是資料結構。 如果是物件,那應該被隱藏起來。 如果它們是資料結構,那本質上必然會揭露內部的結構,則德摩特爾法則在這種情況下並不適用。

(混合體)

半物件半資料結構,擁有函式也擁有公共變數、公共存取器、修改器。 這樣的混合體,會使程式難以添加新的函式,也難以添加新的資料結構。 代表作者不確定(甚至更糟 完全忽略)他們是否需要函式或形態的保護。

隱藏結構

根據要做的事情,去將整個事情包起來,隱藏在物件內部,僅僅取得需要的東西。 讓物件只做一件事情,而不去暴露太多內部資訊。

資料傳輸物件(Data Transfer Objects, DTO)

最佳的資料結構形式,是一個類別裡只有公用變數,沒有任何的函式。 這種資料結構有時候被稱為資料傳輸物件 或 DTO

他們在將資料庫的原始資料轉換成應用程式內的物件時,往往擔任轉換過程的第一階段。

活動紀錄(Active Records)

活動紀錄是一種特殊的DTO,它們是擁有公用(或是可以讓bean存取的)變數的資料結構,但它們通常擁有save 與find 等方法。

不幸的是,有許多開發者會嘗試把這類的資料結構看做物件,然後加入處理商業法則(business rule)的方法。 這非常不洽當,因為會產生資料結構和物件的混合物。

比較好的解法,應該是另外建立一個包含商業法則的物件,用來隱藏內部資料(這些資料很可能就是活動紀錄的實體)的物件。

總結

物件會暴露行為,並隱藏內部資料。 ->不改變行為就輕易添加新類型物件,但現有物件很難增加新行為。

資料結構會暴露其資料,但不會有顯著行為。 ->很容易增加新行為,但很難在現有函式添加新的資料結構。

優秀的軟體開發者,應該根據需求,選擇適合的方法去完成手中工作。

Previous編排Next錯誤處理

Last updated 5 years ago

Was this helpful?