Sau bài viết trước về tại sao chúng ta dùng nil, tôi nghĩ rằng sẽ là ý tưởng tốt để đặt câu hỏi này cho những thứ khác mà chúng ta coi là hiển nhiên.
Như…
Tại sao chúng ta dùng class thay vì chỉ có một KHỐI LỚN mã xấu xí?
Ở mức cơ bản, chúng ta dùng class để tổ chức mã & dữ liệu thành các đơn vị logic.
Nhưng còn nhiều hơn thế.
Một class cho phép bạn tạo ra một trừu tượng (abstraction).
Trừu tượng (Abstraction) là gì?
Bạn sử dụng trừu tượng mỗi ngày, mỗi phút.
Cái bàn phím tôi đang gõ bao gồm:
- Một cáp
- Cherry MX black switches
- Vỏ nhựa giữ mọi thứ lại với nhau
- Mạch in truyền tín hiệu điện đến máy tính
Bàn phím chỉ là một khái niệm nổi lên từ việc gộp những thứ này lại với nhau theo đúng cách.
Nó là một trừu tượng vì bạn không cần biết nó hoạt động như thế nào bên trong để sử dụng nó. Bạn thậm chí không cần biết nó được làm từ những thành phần gì!
Bạn chỉ cần cắm vào & bắt đầu gõ.
Đó chính xác là những gì class cho phép bạn làm.
Tại sao Trừu tượng quan trọng?
Trừu tượng giúp bạn quản lý độ phức tạp.
Như Steve McConnell nói:
“Lý do quan trọng nhất để tạo một class là để giảm độ phức tạp của chương trình”
Trừu tượng hoàn thành điều này như thế nào?
Bằng cách ẩn chi tiết về cách thức hoạt động của một thứ & chỉ hiển thị dịch vụ của nó qua một giao diện công khai (public interface).
Trong class Ruby, giao diện bao gồm các phương thức công khai (public methods). Trong khi chi tiết bị ẩn bằng phương thức riêng tư (private methods).

Với chi tiết tôi muốn nói:
- biến instance
- phương thức nội bộ
- thuật toán & cấu trúc dữ liệu
Khi những thứ này bị ẩn, bạn có thể thay đổi chúng bất cứ khi nào muốn, mà không ảnh hưởng đến người dùng của class bạn.
Ví dụ:
Nếu bạn có class GPS sử dụng mảng để lưu dữ liệu, và bạn phải biết rằng ở chỉ mục 0 của mảng đó bạn sẽ tìm thấy vĩ độ & chỉ mục 1 là kinh độ, đây là những chi tiết bạn không nên phải biết với tư cách là người dùng class.
Cách viết một Class tốt
Bây giờ, đây là chủ đề lớn.
Nhiều điều đi vào việc tạo ra một class tốt, như tuân theo các nguyên tắc SOLID.
Nhưng quan trọng nhất, class của bạn phải có một vai trò nào đó, và không được tạo thành từ các phương thức ngẫu nhiên.
Ví dụ, bạn muốn tách logic nghiệp vụ (tính toán, quy tắc) khỏi logic trình bày (định dạng) vì chúng là những vai trò khác nhau.
Xem mã này:
require 'rest-client'
require 'nokogiri'
class ImageCounter
def initialize(url)
@url = url
end
def find_images_and_report
data = RestClient.get(@url).body
html = Nokogiri::HTML.parse(data)
images = html.css("img")
report = ""
report << "=" * 40 << "\n"
report << "Found #{images.size} images on #{@url} \n"
report << "=" * 40 << "\n"
end
end
reporter = ImageCounter.new("rubyguides.com")
report = reporter.find_images_and_report
Bạn có thể thấy class này quan tâm đến cả tính toán & trình bày. Điều này ổn nếu bạn viết script “nhanh & bẩn”, nhưng cho ứng dụng nghiêm túc hơn bạn muốn tách chúng ra.
Khi bạn tách trách nhiệm, bạn có thể gắn một lớp trình bày khác, hoặc thay đổi quy tắc nghiệp vụ & tái sử dụng cùng trình bày.
Khía cạnh tái sử dụng mã này của class là lý do tốt khác để viết nhiều class hơn.
Có thêm nhiều ý tưởng giúp bạn viết class tốt hơn.
Dưới đây là một số để bạn khám phá thêm:
- Cohesion & Coupling (Cohesion & Coupling)
- Tell, don't ask
- Law of Demeter
Biết tại sao chúng ta viết class là khởi đầu tốt, vì vậy chúc mừng nếu bạn đã đọc hết bài viết!
Tóm tắt
Bạn đã học tại sao chúng ta viết class, trừu tượng là gì & tại sao nó quan trọng. Bạn cũng học các nguyên tắc cơ bản viết class tốt & tôi đã cho bạn một số con trỏ về những gì nên đọc thêm.
Trừ khi bạn muốn mã của mình trở thành Big Ball of Mud, hãy bắt đầu áp dụng một số khái niệm này ngay bây giờ để cải thiện thiết kế class của bạn 🙂
Đừng quên chia sẻ bài viết này trên Twitter nếu bạn thấy nó hữu ích!