Toutes nos félicitations! Vous venez de faire le tour du globe du système de langage / type de programmation, arrivant de l'autre côté du monde d'où vous êtes parti. Vous venez d'atterrir à la frontière du langage dynamique / terre objet basé sur des prototypes!
De nombreux langages dynamiques (par exemple JavaScript, PHP, Python) permettent d'étendre ou de modifier les propriétés des objets lors de l'exécution.
La forme extrême de ceci est un langage basé sur un prototype comme Self ou JavaScript. Ils n'ont pas de cours à proprement parler. Vous pouvez faire des choses qui ressemblent à une programmation basée sur des classes, orientée objet avec héritage, mais les règles sont considérablement assouplies par rapport à des langages basés sur des classes mieux définis comme Java et C #.
Des langages comme PHP et Python vivent au milieu. Ils ont des systèmes basés sur des classes régulières et idiomatiques. Mais les attributs d'objet peuvent être ajoutés, modifiés ou supprimés au moment de l'exécution - bien qu'avec certaines restrictions (comme «sauf pour les types intégrés») que vous ne trouvez pas en JavaScript.
Le gros compromis de ce dynamisme est la performance. Oubliez à quel point la langue est typée fortement ou faiblement, ou à quel point elle peut être compilée en code machine. Les objets dynamiques doivent être représentés comme des cartes / dictionnaires flexibles, plutôt que de simples structures. Cela ajoute une surcharge à chaque accès aux objets. Certains programmes se donnent beaucoup de mal pour réduire ce surcoût (par exemple avec une affectation de kwarg fantôme et des classes basées sur des slots en Python), mais le surcoût supplémentaire est généralement à la hauteur du cours et du prix d'admission.
Pour revenir à votre conception, vous greffez la possibilité d'avoir des propriétés dynamiques sur un sous-ensemble de vos classes. A Product
peut avoir des attributs variables; vraisemblablement un Invoice
ou un Order
serait et ne pourrait pas. Ce n'est pas une mauvaise façon de procéder. Il vous donne la possibilité de varier là où vous en avez besoin, tout en restant dans un système de langage et de type strict et discipliné. En revanche, vous êtes responsable de la gestion de ces propriétés flexibles, et vous devrez probablement le faire via des mécanismes qui semblent légèrement différents des attributs plus natifs. p.prop('tensile_strength')
plutôt que p.tensile_strength
, par exemple, et p.set_prop('tensile_strength', 104.4)
plutôt quep.tensile_strength = 104.4
. Mais j'ai travaillé avec et construit de nombreux programmes en Pascal, Ada, C, Java et même des langages dynamiques qui utilisaient exactement un tel accès getter-setter pour les types d'attributs non standard; l'approche est clairement réalisable.
D'ailleurs, cette tension entre les types statiques et un monde très varié est extrêmement courante. Un problème analogue est souvent observé lors de la conception d'un schéma de base de données, en particulier pour les magasins de données relationnelles et pré-relationnelles. Parfois, il est traité en créant des "super-lignes" qui contiennent suffisamment de flexibilité pour contenir ou définir l'union de toutes les variations imaginées, puis en remplissant toutes les données qui entrent dans ces champs. Le WordPress wp_posts
tableau , par exemple, a des champs comme comment_count
, ping_status
, post_parent
et post_date_gmt
qui ne sont intéressants que dans certaines circonstances, et que , dans la pratique vont souvent en blanc. Une autre approche est une table normalisée très disponible comme wp_options
, tout comme votreProperty
classe. Bien qu'il nécessite une gestion plus explicite, les éléments qu'il contient sont rarement vides. Les bases de données orientées objet et documentaires (par exemple MongoDB) ont souvent plus de facilité à gérer les options changeantes, car elles peuvent créer et définir des attributs à peu près à volonté.