🕐 ~八分鐘讀
📝 關於此文的筆記
此文乃吾個人學習OOP及SOLID原則之筆記所成。欲使此筆記易讀且有益——對吾及他人而言——吾乃借助AI之力,以發展並編輯之,成為博客文章。其意、其學、其解,皆吾之所有;AI僅助於文辭之呈現。
好读易改非偶然。每有悦目之码,其背后必有诸般理念,导其结构,联其脉络。
是文将述其全境——自何为OOP,物如何相系,劣构之状若何,终至SOLID五则,统摄一切。
且进。
篇一:何谓面向对象?
Object Oriented Programming (OOP) 乃摹拟真实之术也。非列长篇之指令,乃将相涉之数据与行止,集于物象中。
🤖 想象玩具之机械。机械有属性(顏色、高度、電池)與行為(行走、言談、揮手)。於面向對象之學,此機器人即為一對象——而用以製造之藍圖謂之類。
要義有二:
- 類——藍圖(模板)
- 對象。 — wujud nyata yang dibuat dari cetak biru tersebut
Empat Pilar OOP
| Pilar | Fungsinya |
|---|---|
| Inheritance | Class anak mewarisi properti dan perilaku dari class induk |
| Encapsulation | Data internal disembunyikan — akses dari luar hanya melalui jalur yang ditentukan |
| Abstraction 四柱OOP 柱之用 承袭者,子类承父类之性 封装者,内蕴隐秘,外求有径 抽象者 | 其内蕴隐,唯所须者显; |
| 多态性; | 同举而异效,视乎其体; |
第二部:物相系之由
物非独存,相系相协,互为依凭——类 之关联,甚为要义。
乃协会也。
两者相知相认,可互为应答。其主次有三:
- 一对一 — 一人持一护照。
- 一对多 — 一师,众弟子。
- 多对多 — 众弟子,众科目。
於協會之中,若一物"有"他物,其關係有二:
- 聚合 (疏) — 子物可獨存於母物亡也。囊盛書,書雖在,囊可棄。
- 組成 (密) — 子物無母物則不立。宅有室;宅毀,室隨之亡。
依賴
权宜之关联。一法中用他法,然不永存之。较之关联,其弱矣.
泛化 & 实现
- 泛化 — 提诸类共性于上位类(继承)
- 实现 — 一类实现接口,承诺履行已定义之契约
第三部分:设计之弊若何?
未习其法,先明所避之要。Robert C. Martin识得设计之弊有三:
🪨 刚硬 — 系统难改。触一端,则众端随之更易。开发者遂畏于更易。
🍪 脆弱(Kerapuhan) — 更易之际,系统无故崩坏。汝修支付模块之虫,而邮件通知骤停。
🏗️ 固定(Ketidakmampuan Dipindahkan) — 件无用之物,不可复用。其与周遭之物磨损过甚,故欲取之,需时更久于从头书写。
三者之弊,根由相同: 组件间依赖管理不善。
第四章:SOLID
SOLID乃五项原则,直解前患。各针对设计之特定缺失。
S — 单一职责原则
一模块当负于一,且仅于一,之角色。
每类必有所适一故而更 — ia melayani satu aktor (satu kelompok stakeholder).
👨🍳 Seorang pekerja restoran yang sekaligus menjadi koki, kasir, satpam, dan pengantar makanan adalah bencana yang menunggu terjadi. Perubahan di satu peran mengganggu semua peran lainnya.
Pisahkan class-mu. Satu tanggung jawab per class.
O — Open/Closed Principle
"工器当开以增,当闭以改。"
增新行宜以扩之,非更旧码之已行也。"
🔌插头可令新器相接,无需解其缆。此OCP之实也。
需更易,则增新码于旧码之侧,勿复书已行之文。
L — 李斯科夫替换原则
若S为T之亚型,则T型之对象可代之以S型之对象,而程序之真不变。
一子类必須可全然替代之乃父类。父所立之誓,子必践之。
🤖若父机能烹,子机亦当能烹,非徒掷错或默然无所为。
若子类有虚法,或施伪实现,或抛"不支持",此乃Liskov之违。
我——接口分离之理。
"客不可强令依其不欲之表。"
勿作广表,强令类施所不必之法于其类。析表为精微之小节。
🍴勿予每客以牛排刀、汤勺、叉、fondue签,若其但索汤。
小之界面即狭之依存,依存之变恒定于局。
D — 依存倒置之则
"高阶模块勿依存低阶模块,二者皆须依存于抽象。"
业务之理不可直系于具体之实。当与界面语。 — 程度低微之细,实践行此界面。
🤖 切勿以烙铁柄触机器人之手。予其手以标准接插件,任其工具可更易。
此乃使基础架构(数据库、API、文件系统)可易换,而不损商业逻辑之理。
简述要旨:SOLID略览
| 原则 | 所解之问题 | 要旨之问 |
|---|---|---|
| 单一职责原则(SRP) | 课业繁重 | "此课是否服务于多个利益相关者群体?" |
| 开放系统互操作性原则 | 修舊码以增新能 | "可否将此添加为扩展,而非修改?" |
| 乐施善教 | Hierarchy yang rusak | "Apakah anak dapat menggantikan induk tanpa kerusakan?" |
| ISP | Interface berlebihan dengan method yang tidak digunakan | "Apakah class ini dipaksa untuk mengimplementasikan sesuatu yang tidak diperlukan?" |
| DIP | Logika bisnis terikat pada infrastruktur | "Apakah kode tingkat tinggi bergantung pada class konkret yang seharusnya tidak?" |
Mulai dari Mana?
Kalau kamu baru pertama kali menerapkan ini:
- Mulai dengan SRP — cari class yang "mengerjakan terlalu banyak" dan pecah
- Periksa pewarisan untuk pelanggaran LSP — method kosong adalah tanda peringatannya 何謂高階代碼偏倚於本應無關之具體類別?其始何在? 若君初習此道:自單一職責原則始——尋類別「職責過重」者而析之。 察繼承以違反里氏替換原則——空方法乃警示之徵。
- 于基设之畔增接口 — 此乃DIP于实践之要义
此等原则非清单。乃每执笔为码时当自诘之问.
初载于sanudin.dev











