Giao diện
Thật khó để hiểu mục đích của một công cụ giải quyết vấn đề mà bạn chưa bao giờ gặp phải. Tôi đã không hiểu giao diện một lúc sau khi tôi bắt đầu lập trình. Chúng tôi sẽ hiểu những gì họ đã làm, nhưng tôi không biết tại sao bạn muốn sử dụng nó.
Đây là vấn đề - bạn biết bạn muốn làm gì, nhưng bạn có nhiều cách để làm điều đó hoặc bạn có thể thay đổi cách bạn thực hiện sau này. Sẽ thật tuyệt nếu bạn có thể đóng vai trò của người quản lý không biết gì - sủa một số đơn đặt hàng và có kết quả bạn muốn mà không quan tâm đến cách thực hiện.
Giả sử bạn có một trang web nhỏ và bạn lưu tất cả thông tin của người dùng trong tệp csv. Không phải là giải pháp phức tạp nhất, nhưng nó hoạt động đủ tốt để lưu trữ thông tin người dùng của mẹ bạn. Sau đó, trang web của bạn cất cánh và bạn có 10.000 người dùng. Có lẽ đã đến lúc sử dụng một cơ sở dữ liệu thích hợp.
Nếu ban đầu bạn thông minh, bạn sẽ thấy điều này sắp tới và không thực hiện các cuộc gọi để lưu trực tiếp vào csv. Thay vào đó, bạn nghĩ về những gì bạn cần nó để làm, bất kể nó được thực hiện như thế nào. Hãy nói store()
và retrieve()
. Bạn thực hiện một Persister
giao diện với các phương pháp trừu tượng cho store()
và retrieve()
và tạo ra một CsvPersister
lớp con mà thực sự thực hiện các phương pháp đó.
Sau đó, bạn có thể tạo một DbPersister
chương trình thực hiện lưu trữ và truy xuất dữ liệu thực tế hoàn toàn khác với cách lớp csv của bạn đã làm điều đó.
Điều tuyệt vời là, tất cả những gì bạn phải làm bây giờ là thay đổi
Persister* prst = new CsvPersister();
đến
Persister* prst = new DbPersister();
và thế là xong. Các cuộc gọi của bạn đến prst.store()
và prst.retrieve()
tất cả vẫn sẽ hoạt động, chúng chỉ được xử lý khác nhau "đằng sau hậu trường".
Bây giờ, bạn vẫn phải tạo các triển khai cvs và db, vì vậy bạn chưa có kinh nghiệm làm ông chủ. Những lợi ích thực sự rõ ràng khi bạn sử dụng các giao diện mà người khác tạo ra. Nếu ai đó đủ tử tế để tạo CsvPersister()
và DbPersister()
đã có, thì bạn chỉ cần chọn một và gọi các phương thức cần thiết. Nếu bạn quyết định sử dụng cái khác sau này, hoặc trong một dự án khác, bạn đã biết nó hoạt động như thế nào.
Tôi thực sự không hài lòng với C ++ của mình, vì vậy tôi sẽ chỉ sử dụng một số ví dụ lập trình chung. Container là một ví dụ tuyệt vời về cách giao diện làm cho cuộc sống của bạn dễ dàng hơn.
Bạn có thể có Array
, LinkedList
, BinaryTree
, vv tất cả các lớp con của Container
trong đó có phương pháp như insert()
, find()
, delete()
.
Bây giờ khi thêm một cái gì đó vào giữa danh sách được liên kết, bạn thậm chí không cần phải biết danh sách được liên kết là gì. Bạn chỉ cần gọi myLinkedList->insert(4)
và nó lặp đi lặp lại một cách kỳ diệu thông qua danh sách và dán nó vào đó. Ngay cả khi bạn biết một danh sách được liên kết hoạt động như thế nào (mà bạn thực sự cần), bạn không phải tìm kiếm các chức năng cụ thể của nó, bởi vì bạn có thể đã biết những gì chúng sử dụng khác nhau Container
trước đó.
Lớp học trừu tượng
Các lớp trừu tượng khá giống với các giao diện (các giao diện kỹ thuật tốt là lớp trừu tượng, nhưng ở đây tôi có nghĩa là các lớp cơ sở có một số phương thức của chúng được bổ sung.
Giả sử bạn đang tạo trò chơi và bạn cần phát hiện khi kẻ thù ở trong khoảng cách nổi bật của người chơi. Bạn có thể tạo một lớp cơ sở Enemy
có một phương thức inRange()
. Mặc dù có nhiều điều về kẻ thù khác nhau, phương pháp được sử dụng để kiểm tra phạm vi của chúng là phù hợp. Do đó, Enemy
lớp của bạn sẽ có một phương thức xác thực để kiểm tra phạm vi, nhưng các phương thức ảo thuần túy cho những thứ khác không có sự tương đồng giữa các loại kẻ thù.
Điều tuyệt vời ở đây là nếu bạn làm rối mã phát hiện phạm vi hoặc muốn điều chỉnh nó, bạn chỉ phải thay đổi nó ở một nơi.
Tất nhiên có nhiều lý do khác cho giao diện và các lớp cơ sở trừu tượng, nhưng đó là một số lý do tại sao bạn có thể sử dụng chúng.
Người độc thân
Thỉnh thoảng tôi sử dụng chúng và tôi chưa bao giờ bị chúng đốt cháy. Điều đó không có nghĩa là họ sẽ không hủy hoại cuộc sống của tôi tại một số điểm, dựa trên kinh nghiệm của những người khác.
Đây là một cuộc thảo luận tốt về nhà nước toàn cầu từ một số người có kinh nghiệm và cảnh giác hơn:
Tại sao Nhà nước toàn cầu lại xấu xa như vậy?