Xin chúc mừng! Bạn vừa đi vòng quanh thế giới ngôn ngữ lập trình / loại hệ thống, đến bên kia thế giới từ nơi bạn khởi hành. Bạn vừa hạ cánh trên biên giới của vùng đất đối tượng dựa trên ngôn ngữ động / nguyên mẫu!
Nhiều ngôn ngữ động (ví dụ JavaScript, PHP, Python) cho phép một ngôn ngữ mở rộng hoặc thay đổi các thuộc tính đối tượng khi chạy.
Hình thức cực đoan của điều này là một ngôn ngữ dựa trên nguyên mẫu như Tự hoặc JavaScript. Họ không có lớp học, nói đúng ra. Bạn có thể thực hiện những thứ trông giống như lập trình hướng đối tượng dựa trên lớp với kế thừa, nhưng các quy tắc được nới lỏng rất nhiều so với các ngôn ngữ dựa trên lớp được định nghĩa rõ ràng hơn như Java và C #.
Langauges như PHP và Python sống ở giữa. Họ có hệ thống dựa trên lớp thường xuyên, thành ngữ. Nhưng các thuộc tính đối tượng có thể được thêm, thay đổi hoặc xóa trong thời gian chạy - mặc dù có một số hạn chế (như "ngoại trừ các loại tích hợp") mà bạn không tìm thấy trong JavaScript.
Sự đánh đổi lớn cho sự năng động này là hiệu suất. Quên ngôn ngữ gõ mạnh hay yếu như thế nào, hoặc nó có thể được biên dịch thành mã máy tốt đến mức nào. Các đối tượng động phải được biểu diễn dưới dạng bản đồ / từ điển linh hoạt, thay vì các cấu trúc đơn giản. Điều này thêm chi phí cho mọi đối tượng truy cập. Một số chương trình cố gắng hết sức để giảm chi phí này (ví dụ như với phép gán kwarg ảo và các lớp dựa trên vị trí trong Python), nhưng chi phí phụ thường chỉ ngang bằng với khóa học và giá nhập học.
Quay trở lại thiết kế của bạn, bạn đang ghép khả năng có các thuộc tính động vào một tập hợp con của các lớp. A Product
có thể có các thuộc tính thay đổi; có lẽ là một Invoice
hoặc Order
sẽ và không thể. Đó không phải là một cách tồi để đi. Nó cho phép bạn linh hoạt để có sự thay đổi ở nơi bạn cần, trong khi vẫn ở trong một hệ thống ngôn ngữ và loại nghiêm ngặt, kỷ luật. Về mặt trái, bạn chịu trách nhiệm quản lý các thuộc tính linh hoạt đó và có thể bạn sẽ phải làm như vậy thông qua các cơ chế trông hơi khác so với các thuộc tính bản địa hơn. p.prop('tensile_strength')
thay vì p.tensile_strength
, ví dụ, và p.set_prop('tensile_strength', 104.4)
hơn làp.tensile_strength = 104.4
. Nhưng tôi đã làm việc với và xây dựng nhiều chương trình bằng Pascal, Ada, C, Java và thậm chí các ngôn ngữ động sử dụng chính xác quyền truy cập getter-setter như vậy cho các loại thuộc tính không chuẩn; Cách tiếp cận rõ ràng là khả thi.
Bởi, sự căng thẳng giữa các loại tĩnh và một thế giới rất đa dạng là vô cùng phổ biến. Một vấn đề tương tự thường thấy khi thiết kế lược đồ cơ sở dữ liệu, đặc biệt là đối với các kho lưu trữ dữ liệu quan hệ và tiền quan hệ. Đôi khi, nó được xử lý bằng cách tạo ra các "siêu hàng" có đủ độ linh hoạt để chứa hoặc xác định sự kết hợp của tất cả các biến thể tưởng tượng, sau đó nhồi bất kỳ dữ liệu nào đi vào các trường đó. Các WordPress wp_posts
bảng , ví dụ, có các lĩnh vực như comment_count
, ping_status
, post_parent
và post_date_gmt
đó chỉ là thú vị trong một số trường hợp, và rằng trong thực tế thường chuyển sang màu trắng. Một cách tiếp cận khác là một bảng rất bình thường , bình thường như wp_options
, giống như của bạnProperty
lớp học. Mặc dù nó đòi hỏi quản lý rõ ràng hơn, các mục trong đó hiếm khi trống. Cơ sở dữ liệu hướng đối tượng và tài liệu (ví dụ MongoDB) thường có thời gian xử lý các tùy chọn thay đổi dễ dàng hơn, vì chúng có thể tạo và thiết lập các thuộc tính khá nhiều theo ý muốn.