Я ніколи не розумів таких тверджень. Якщо чесно, навіть якщо ви оголосите тип повернення функції, ви можете і забудете його після того, як ви написали багато рядків коду, і вам все одно доведеться повернутися до рядка, в якому він оголошений за допомогою функції пошуку ваш текстовий редактор, щоб перевірити це.
Справа не в тому, що ти забудеш тип повернення - це завжди станеться. Йдеться про те, що інструмент може повідомити вам, що ви забули тип повернення.
Окрім того, як функції оголошуються типом, без того funcname()...
, щоб знати тип, вам доведеться шукати кожен рядок, у якому функція викликається, тому що ви знаєте лише ви funcname
, тоді як у Python тощо, які ви могли просто шукати def funcname
або function funcname
які трапляються лише один раз , при декларації.
Це питання синтаксису, який абсолютно не пов'язаний зі статичним набором тексту.
Синтаксис сімейства C справді недружній, коли ви хочете шукати декларацію, не маючи в своєму розпорядженні спеціалізованих інструментів. Інші мови не мають цієї проблеми. Дивіться синтаксис декларації Руста:
fn funcname(a: i32) -> i32
Більше того, з REPLs тривіально тестувати функцію на тип повернення з різними входами, тоді як зі статично набраними мовами вам потрібно буде додати кілька рядків коду та перекомпілювати все, щоб знати тип оголошеного типу.
Будь-яка мова може бути інтерпретована і будь-яка мова може мати відповідь.
Отже, окрім того, як знати тип повернення функції, яка явно не є сильною стороною статично набраних мов, наскільки статичне введення дійсно допомагає у великих проектах?
Я відповім абстрактно.
Програма складається з різних операцій, і ці операції викладаються такими, якими вони є, через деякі припущення, які робить розробник.
Деякі припущення неявні, а деякі явні. Деякі припущення стосуються операції поблизу них, деякі стосуються операції, подалі від них. Припущення простіше визначити, коли воно виражається явно і максимально наближено до місць, де має значення його істина.
Помилка - це прояв припущення, яке існує в програмі, але не застосовується для деяких випадків. Щоб виявити помилку, нам потрібно виявити помилкове припущення. Щоб видалити помилку, нам потрібно або видалити це припущення з програми, або щось змінити, щоб припущення насправді було справедливим.
Я б хотів класифікувати припущення на два види.
Перший вид - це припущення, які можуть бути, а можуть і не виконуватись, залежно від вхідних даних програми. Щоб визначити помилкове припущення подібного роду, нам потрібно здійснити пошук у просторі всіх можливих входів програми. Використовуючи освічені здогадки та раціональне мислення, ми можемо звузити проблему та шукати у значно меншому просторі. Але все-таки, коли програма трохи зростає, її початковий простір введення зростає з величезними темпами - до того, коли її можна вважати нескінченною для всіх практичних цілей.
Другий вид - це припущення, які, безумовно, стосуються всіх входів, або, безумовно, помилкові для всіх входів. Коли ми визначаємо подібне припущення як помилкове, нам навіть не потрібно запускати програму або перевіряти будь-які дані. Коли ми визначимо припущення такого роду як правильне, у нас є один менш підозрюваний, про який слід піклуватися, коли ми відстежуємо помилку ( будь-яку помилку). Тому існує цінність у тому, щоб якомога більше припущень належати саме до цього виду.
Щоб припустити припущення до другої категорії (завжди правдивої чи завжди помилкової, незалежно від вхідних даних), нам потрібна мінімальна кількість інформації, щоб вона була доступною в тому місці, де зроблено припущення. Через вихідний код програми досить швидко застаріла інформація (наприклад, багато компіляторів не роблять міжпроцедурний аналіз, що робить будь-який виклик важкою межею для більшості інформації). Нам потрібен спосіб зберегти необхідну інформацію свіжою (дійсною та поблизу).
Один із способів - це джерело цієї інформації якомога ближче до місця, де вона буде споживатися, але це може бути непрактично для більшості випадків використання. Інший спосіб - часто повторювати інформацію, поновлюючи її актуальність у вихідному коді.
Як ви вже здогадалися, статичні типи саме такі - маяки інформації про тип, розкидані по вихідному коду. Ця інформація може бути використана для розміщення більшості припущень щодо правильності типу другої категорії, тобто майже будь-яку операцію можна класифікувати як завжди правильну або завжди неправильну щодо сумісності типів.
Коли наші типи невірні, аналіз економить нам час, доводячи помилку до уваги раніше, ніж пізно. Коли наші типи правильні, аналіз економить нам час, гарантуючи, що, коли виникає помилка, ми можемо негайно виключити помилки типу.