Як хтось згадував, теоретично не можна багато чого зробити з динамічним набором тексту, якого ти не міг би зробити зі статичним набором тексту, якщо ти самостійно реалізуєш певні механізми. Більшість мов надають механізми релаксації типів для підтримки гнучкості типу, таких як пусті покажчики, і тип кореневого об’єкта або порожній інтерфейс.
Питання в тому, чому динамічне введення тексту підходить і підходить у певних ситуаціях та проблемах.
Спочатку давайте визначимось
Суб'єкт - мені потрібно загальне поняття про якусь сутність у коді. Це може бути все, від примітивного числа до складних даних.
Поведінка - скажімо, у нашої сутності є певний стан і набір методів, які дозволяють навколишньому світу навчити суб'єкта певних реакцій. Дозволяє називати стан + інтерфейс цього об'єкта його поведінкою. Одне об'єднання може мати більше, ніж одна поведінка, певним чином поєднана засобами мови, що надаються.
Визначення сутностей та їх поведінки - кожна мова містить певні засоби абстракцій, які допомагають визначити поведінку (набір методів + внутрішній стан) певних сутностей у програмі. Ви можете призначити ім'я такої поведінки і сказати, що всі випадки такої поведінки мають певний тип .
Це, мабуть, щось, що не таке незнайоме. І як ви сказали, ви зрозуміли різницю, але все ж. Напевно, не повне і найточніше пояснення, але я сподіваюся, що веселощі достатньо, щоб принести певну цінність :)
Статичне введення тексту - поведінка всіх об'єктів у вашій програмі вивчається за час компіляції, перш ніж почати запуск коду. Це означає, що якщо ви хочете, наприклад, у вашої сутності типу Person мати поведінку (поводитись, як) Magician, то вам доведеться визначити сутність MagicianPerson і надати їй поведінку фокусника на зразок castMagic (). Якщо ви в своєму коді, помилково скажіть звичайному компілятору Person.throwMagic ()"Error >>> hell, this Person has no this behavior, dunno throwing magics, no run!".
Динамічне введення тексту - в умовах динамічного набору тексту поведінка сутностей не перевіряється, поки ви дійсно не спробуєте зробити щось із певною сутністю. Запуск коду Ruby, який запитує Person.throwMagic (), не буде спійманий, поки ваш код дійсно не надійде. Це звучить неприємно, чи не так? Але це також звучить викривально. На основі цієї властивості ви можете робити цікаві речі. Скажімо, скажімо, ви розробляєте гру, де все може звернутися до Magician, і ви насправді не знаєте, хто це буде, поки ви не дійдете до певного коду. І тоді приходить Жаба, і ти кажешHeyYouConcreteInstanceOfFrog.include Magic
і відтоді ця Жаба стає однією конкретною Жабою, яка має Магічні сили. Інші Жаби, ще ні. Розумієте, в мовах статичного введення вам доведеться визначити це відношення за допомогою якогось стандартного середнього значення комбінації поведінки (наприклад, реалізація інтерфейсу). У динамічній мові набору тексту ви можете це робити під час виконання і нікому не буде байдуже.
Більшість мов динамічного набору тексту мають механізми, що забезпечують загальну поведінку, яка вловлює будь-яке повідомлення, яке передається їх інтерфейсу. Наприклад, Ruby method_missing
і PHP, __call
якщо я добре пам'ятаю. Це означає, що ви можете робити будь-які цікаві речі під час виконання програми та приймати рішення типу, виходячи з поточного стану програми. Це дає інструменти для моделювання проблеми, які є набагато більш гнучкими, ніж, скажімо, консервативна статична мова програмування, як Java.