SOLID Principles - Kim Dung Truyện
https://web.archive.org/web/20150906155800/http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf
Tổ sư, bang chủ Robert C. Martin (internet)
Trong thế giới code hiệp, khi kể đến cao thủ của môn phái Cái Bang, không ai không biết đến bang chủ Robert C. Martin, được gọi thân mật là lão "Uncle Bob". Ông là người đưa đến Cái Bang bí kiếp quý báu đầu tiên đó là cuốn bí kiếp "Design Principles and Design Patterns".
Cuốn sách này không chỉ là một tuyển tập
kiến thức, mà chính là nguồn cảm hứng, là nền tảng vững chắc cho các đệ tử của
Cái Bang.
Uncle Bob, với tư cách là bang chủ của Cái Bang, đã
truyền đạt những nguyên lý thiết kế và các mẫu thiết kế quý báu, giúp các võ sư
trẻ có thể đối mặt với mọi thử thách trong thế giới rộng lớn của lập trình. Như
một bậc thầy kiến thức, ông không chỉ dạy kỹ thuật, mà còn truyền đạt tinh thần
võ học - lòng kiên nhẫn, sự quyết tâm và lòng trung hiếu đạo.
Dưới bàn tay của bậc kỳ tài code học Uncle Bob, những
nguyên lý trở thành bậc thang của võ công lập trình, giúp các võ sư xây dựng mã
nguồn vững chắc và dễ dàng bảo trì. Thay vì chỉ dẫn đạo về cú đấm mạnh mẽ,
Uncle Bob đã dạy cho các môn sinh cách sử dụng chiêu thức linh hoạt và thông minh,
giống như những tuyệt kỹ trong võ lâm.
Nhưng trên hết, Uncle Bob không chỉ là một bang chủ của Cái Bang, mà còn là một huyền thoại trong thế giới võ hiệp lập trình. Nhờ những
công trình của mình, ông đã giúp cho Cái Bang phát triển mạnh mẽ, từ những kẻ ăn
mày hôi hám vô danh trở thành các cao thủ và có vị thế trong võ lâm.
Vậy nên, tại cái bang, Uncle Bob không chỉ là một lão ăn
mày bang chủ, mà là một huyền thoại sống động, một nguồn động viên mãnh liệt và
một nguồn đạo lý đằng sau cho mỗi đệ tử trẻ cố gắng trên con đường rèn luyện võ
công của mình. Trong lòng môn phái Cái Bang, Uncle Bob không chỉ là một bang chủ,
mà là một người anh hùng, một tấm gương sáng của lòng trung hiếu và lòng đam mê
không ngừng được sánh ngang với các bang chủ đời trước như Hồng Tứ Hải, Tiêu Phong,Hồng
Thất Công…
Câu chuyện về việc Michael Feathers đặt ra từ viết tắt
SOLID như một bí mật sâu thẳm đang lan truyền như một truyền thuyết. Người ta kể
rằng, sau khi tiếp nhận vị trí bang chủ Cái Bang đời tiếp theo của môn phái, Michael
Feathers đã được các bô lão trong bang truyền cuốn bí kiếp võ công từ bang chủ đời
trước,một cuốn bí kiếp cổ xưa cũ kỹ bụi
bặm của thời gian.
Cuốn sách này chứa đựng những bí mật của một truyền thống
võ học mà không ai biết tới, bí kiếp SOLID. Thông
qua nghiên cứu sâu rộng và sự siêng năng lớn lao, đã giải mã được bí mật này và
đặt ra từ viết tắt SOLID, mở ra một trang mới trong cuốn sách của võ lâm lập
trình.
Nhưng điều kỳ diệu không chỉ đến từ việc Michael
Feathers giải mã SOLID, mà còn từ việc ông biết cách tận dụng kiến thức này để
giúp đỡ các đệ tử trẻ trên con đường của họ. Ông truyền dạy về Nguyên tắc trách nhiệm duy nhất (Single Responsibility Principle (SRP)), về Nguyên tắc đóng mở (Open-Closed Principle (OCP)), về Nguyên tắt thay thế (Liskov Substitution Principle (LSP)), về Nguyên tắt phân chia Interface (Interface Segregation Principle (ISP)) và về Nguyên tắt mềm dẻo không phụ thuộc (Dependency Inversion Principle (DIP)) như những phép thuật lập trình.
Từ khi Michael Feathers tiết lộ ra từ viết tắt SOLID,
võ lâm lập trình chưa bao giờ yên bình như vậy. Các đệ tử trẻ không chỉ học được
những kỹ năng mới, mà còn nhận thức được giá trị thực sự của việc giữ gìn truyền
thống và học hỏi từ những bậc tiền bối. Ông không chỉ là một người giỏi võ
công, mà còn là nguồn động viên mãnh liệt, là nguồn sáng soi đường cho tất cả
những ai đam mê hành nghề lập trình.
Từ viết tắt SOLID của Michael Feathers, võ lâm lập
trình tiếp tục phát triển, rộng mở và hùng mạnh. Những câu chuyện về những người
anh hùng giống như ông là nguồn động viên không ngừng, là ngọn đèn soi sáng con
đường dẫn đến đỉnh cao của võ học, nơi mà mọi cao thủ đều ao ước đặt chân đến.
Hồi I. Single Responsibility Principle (SRP)
Single Responsibility Principle (SRP) là một trong những nguyên tắc quan trọng trong lập trình hướng đối tượng. Theo nguyên tắc này, mỗi class hoặc module trong một chương trình nên chỉ có một trách nhiệm duy nhất, nghĩa là chỉ nên thay đổi vì một lý do duy nhất.
Giống như một môn đồ trong môn phái Cái Bang, người
tuân thủ nguyên tắc cần chú tâm vào việc truyền đạt và luyện tập các chiêu thức
võ công của mình một cách chính xác và hiệu quả nhất. Họ không bao giờ truyền
thụ cho môn đồ khác các chiêu không cần thiết hoặc không nằm trong các chiêu thức
không phù hợp.
Ví dụ : Trong Cái Bang có Hàng long thập bát chưởng và Đã cẩu bổn pháp, là các môn võ trấn bang vì vậy khi truyền lại cho truyền nhân đời
tiếp theo cần luyện tập theo cấp độ và từng bước một.
Giống như một môn đồ khi luyện tập chiêu thức thứ nhất của Hàng long thập bát chưởng như :
Phi Long Tại Thiên: nhảy lên không trung, từ trên cao đánh xuống, uy lực cực mạnh trong một cú. Khi chưa thuần thục hoặc đang xuất chiêu thứ nhất đánh vào đối thủ nhưng đối thủ lại trúng chiêu thứ hai là Kiến Long Tại Điền : chuyển thủ làm công, có thể hóa giải thế lao của địch, thuận thế phản công, phát ra chiêu thức vừa mạnh vừa mau.
Trong lập trình, việc tuân thủ nguyên tắc Single Responsibility Principle đồng nghĩa với việc mỗi class hoặc module chỉ nên chịu trách nhiệm về một nhiệm vụ cụ thể.
Ví dụ : Một lớp quản lý người dùng không nên đồng thời chịu trách nhiệm về
việc xác thực người dùng và lưu trữ thông tin người dùng vào cơ sở dữ liệu.
Thay vào đó, chúng ta nên tách thành hai lớp riêng biệt: một lớp xác thực người
dùng và một lớp quản lý cơ sở dữ liệu người dùng. Điều này giúp cho mã nguồn dễ
đọc, dễ hiểu và dễ bảo trì hơn.
Nếu ta không tuân thủ nguyên tắc Single Responsibility Principle, mã nguồn có thể trở nên phức tạp và khó hiểu, khiến cho việc phát triển và bảo trì trở nên khó khăn.
Việc chia nhỏ trách nhiệm giúp chúng ta tối ưu hóa sự linh hoạt và dễ
dàng mở rộng hệ thống mà không ảnh hưởng đến các phần khác của mã nguồn, giống
như việc các cao thủ trong môn phái Cái Bang chỉ tập trung vào việc rèn luyện
võ công của mình mà không làm xao lãng sự chú ý và tập trung. Điều này giúp họ
trở thành những cao thủ không ngừng hoàn thiện kỹ năng và đồng thời giữ vững
vị thế của môn phái Cái Bang trong võ lâm.
Hồi II. Open-Closed Principle (OCP)
Open-Closed Principle là một trong những nguyên tắc quan trọng trong nguyên tắc SOLID của lập trình hướng đối tượng. Nguyên tắc này nói rằng một lớp nên mở rộng để mở rộng các chức năng hoặc thêm các tính năng mới mà không cần sửa đổi mã nguồn hiện tại.
Trong các loại võ công của Cái Bang, việc tuân thủ nguyên tắc Open-Closed
Principle giống như việc một môn đồ không cần phải sửa đổi các kỹ thuật võ công
cơ bản của mình khi họ học thêm các kỹ thuật mới hoặc phát triển các chiêu thức
riêng.
Thay vào đó, họ có thể mở rộng kiến thức của mình mà
không ảnh hưởng đến những gì họ đã học trước đó giống như học Đã cẩu bổn pháp
không cần phải tập lại đứng tấn vậy.
Trong lập trình, việc tuân thủ nguyên tắc Open-Closed
Principle đồng nghĩa với việc chúng ta nên thiết kế các Class và modules sao
cho chúng có thể được mở rộng mà không cần phải thay đổi mã nguồn đã tồn tại.
Thay vì sửa đổi mã nguồn của một lớp khi cần thêm chức năng mới, chúng ta nên tạo
ra các Class mới hoặc Interfaces để thêm các chức năng mới mà không làm ảnh hưởng
đến các phần đã hoạt động.
Việc tuân thủ nguyên tắc Open-Closed Principle giúp mã
nguồn trở nên linh hoạt hơn và dễ dàng mở rộng trong tương lai mà không phải lo
lắng về việc gây ra lỗi trong các phần đã hoạt động. Điều này tạo điều kiện thuận
lợi để phát triển và bảo trì ứng dụng một cách hiệu quả và an toàn.
Hồi III. Liskov Substitution Principle (LSP)
Liskov Substitution Principle là một trong những
nguyên tắc quan trọng của nguyên tắc SOLID trong lập trình hướng đối tượng.
Nguyên tắc này đặt ra rằng các thực thể của một lớp cơ sở(superclass) nên có thể
được thay thế bằng các thực thể của lớp con(subclass) mà không làm thay đổi
tính đúng đắn của chương trình.
Trong môn phái Cái Bang, việc tuân thủ nguyên tắc Liskov
Substitution Principle có thể được hiểu như việc bất kỳ đệ tử nào của môn phái
Cái Bang cũng nên có thể tham gia vào các trận đấu võ thuật mà không làm mất đi
danh dự hoặc hiệu suất của môn phái. Điều này đảm bảo rằng mỗi đệ tử đều có khả
năng thể hiện bản thân một cách đồng nhất và đúng đắn như các cao thủ.
Trong lập trình, việc tuân thủ nguyên tắc Liskov
Substitution Principle đồng nghĩa với việc các lớp con(subclasses) nên thừa hưởng
và mở rộng (inherit và extend)các chức năng của lớp cơ sở(superclass) mà không
làm thay đổi hành vi của chương trình khi sử dụng các thực thể của các lớp con(subclasses)
thay thế cho lớp cơ sở(superclass). Điều này giúp cho việc sử dụng các đối tượng
tương tự nhau một cách nhất quán và dễ dàng bảo trì.
Nếu nguyên tắc Liskov Substitution Principle không được
tuân thủ, việc sử dụng các đối tượng của các lớp con(subclasses) có thể dẫn đến
các hành vi không mong muốn hoặc lỗi trong chương trình, gây ra các vấn đề khó
xác định và sửa chữa. Điều này làm giảm tính linh hoạt và sự tin cậy của mã nguồn,
gây khó khăn trong việc phát triển và bảo trì ứng dụng.
Hồi IV. Interface Segregation Principle (ISP)
Interface Segregation Principle là một trong những nguyên tắc trong nguyên tắc
SOLID của lập trình hướng đối tượng. Nguyên tắc này đề xuất rằng một lớp
không nên bị ép buộc để triển khai các phương thức mà nó không sử dụng. Thay
vào đó, nên tạo ra các giao diện nhỏ, tinh gọn chỉ chứa các phương thức cần thiết
cho các lớp sử dụng chúng.
Trong môn phái Cái Bang, việc tuân thủ nguyên tắc Interface
Segregation Principle có thể được hiểu
như việc mỗi môn đồ chỉ nên học những kỹ thuật và chiêu thức võ công mà họ thực
sự cần để trở thành cao thủ võ lâm. Họ không nên bị ép buộc phải học những
chiêu thức không liên quan chỉ để đạt được danh hiệu hoặc vị thế trong môn
phái.
Ví dụ : nếu một
cao thủ Cái Bang học Hàng long thập bát chưởng nếu xuất sắc chỉ cần đến cấp 12
như Kháng Long Hữu Hối : chiêu thức cực mạnh, bá lực đương thời là vô địch,
lợi hại ở chỗ xuất chiêu vẫn bảo lưu, nhân lúc kẻ địch hấp hối thì vồ thêm một
cú cũng đủ làm cho đối phương phá vỡ toàn bộ kinh mạch không thể cứu chữa.
Trong lập trình, việc tuân thủ nguyên tắc Interface
Segregation Principle đồng nghĩa với việc
tạo ra các interfaces nhỏ và tinh gọn chứa ít phương thức nhất có thể. Điều này
giúp tránh việc các lớp phải triển khai các phương thức không liên quan đến
chúng, giảm thiểu sự phức tạp và làm cho mã nguồn trở nên dễ đọc và hiểu hơn.
Khi các giao diện được thiết kế chính xác và tách biệt, các lớp chỉ cần triển khai các phương thức cần thiết cho chúng. Điều này tăng tính modularity(một khái niệm chia nhỏ trong hệ thống thành các modules hoặc components), giúp cho việc mở rộng và bảo trì mã nguồn trở nên dễ dàng hơn.
Việc tuân thủ nguyên tắc Interface
Segregation Principle giúp tránh được sự
phụ thuộc không mong muốn giữa các lớp và giao diện, giữ cho hệ thống linh hoạt
và dễ dàng thay đổi khi cần thiết.
Hồi V. Dependency Inversion Principle (DIP)
Dependency Inversion Principle là một trong những nguyên tắc quan trọng của
nguyên tắc SOLID trong lập trình hướng đối tượng. Nguyên tắc này nói rằng các
module cấp cao(high-level modules) không nên phụ thuộc vào các module cấp thấp(low-level modules). Cả hai nên phụ thuộc
vào một Interface hoặc các lớp trừu tượng (Abtraction Class) và không nên phụ
thuộc vào chi tiết cụ thể.
Trong môn phái Cái Bang, việc tuân thủ nguyên tắc Dependency
Inversion Principle có thể được hiểu như
việc khi học xong Hàng long thập bát chưởng có 18 thức (Phi Long Tại Thiên, Kiến
Long Tại Điền, Hồng Tiệm Vu Lục, Tiềm Long Vật Dụng, Lợi Thiệp Đại Xuyên, Thần
Long Bãi Vĩ, Đột Như Kì Lai, Song Long Thủ Thủy, Thời Thừa Lục Long, Long Chiến
Tại Dã, Lí Sương Băng Chí, Kháng Long Hữu Hối, Tả Hữu Thần Long, Giao Long
Phiên Giang, Cuồng Long Loạn Vũ, Bất Kham Nhất Kích, Long Du Thiên Địa, Long Đằng
Ngũ Nhạc) thì mỗi môn đồ những ai được truyền thụ qua các đời khi đã luyện thành
thì khi sử dụng chiêu thức tùy vào tình huống có thể xuất chiêu, cũng như có thể
dùng Cuồng Long Loạn Vũ hay Song Long Thủ
Thủy… không phải cần xuất chiêu thứ tự chiêu thứ nhất đến chiêu cuối cùng.
Giống như việc cao thủ này vẫn phải tuân thủ các quy tắc
và cách xuất chiêu của 18 thức, nhưng có thế chọn 1 trong các chiêu phù hợp vào
từng tình huống.
Trong lập trình, việc tuân thủ nguyên tắc Dependency
Inversion Principle đồng nghĩa với việc
các lớp cấp cao(high-level classes) không nên biết về chi tiết cụ thể của các lớp
cấp thấp(low-level classes), mà cả hai nên phụ thuộc vào các giao diện hoặc lớp
trừu tượng(interfaces hoặc abstract classes). Điều này tạo ra sự linh hoạt
trong việc thay đổi và cải thiện các module mà không làm ảnh hưởng đến các phần
khác của hệ thống.
Khi các phụ thuộc được quản lý thông qua các giao diện hoặc lớp trừu tượng(interfaces hoặc abstract classes), chúng ta có thể dễ dàng thay đổi hoặc thay thế các module mà không làm ảnh hưởng đến các phần khác của hệ thống.
Điều này giúp cho mã nguồn trở nên dễ dàng bảo trì, mở rộng và thử
nghiệm, đồng thời tăng cường tính linh hoạt và tái sử dụng trong quá trình phát
triển ứng dụng.
Nhãn: Reference