Ось проблема програмування / мови, про яку я хотів би почути ваші думки.
Ми розробили умови, які більшість програмістів (слід) дотримуватися, які не є частиною синтаксису мов, але служать для того, щоб зробити код читабельнішим. Вони, звичайно, завжди є предметом дискусій, але є принаймні деякі основні концепції, які вважають прийнятними більшість програмістів. Доречне іменування змінних, найменування в цілому, роблячи рядки не надмірно довгими, уникаючи довгих функцій, інкапсуляцій, цих речей.
Однак є проблема, що я ще не можу знайти когось, коментуючи це, і що якраз може бути найбільшою з цих груп. Проблема полягає в тому, що аргументи є анонімними під час виклику функції.
Функції випливають з математики, де f (x) має чітке значення, оскільки функція має набагато більш жорстке визначення, яке вона зазвичай робить у програмуванні. Чисті функції з математики можуть зробити набагато менше, ніж вони можуть бути в програмуванні, і вони є набагато більш елегантним інструментом, вони зазвичай беруть лише один аргумент (який, як правило, число), і вони завжди повертають одне значення (також зазвичай число). Якщо функція бере кілька аргументів, вони майже завжди є лише додатковими розмірами домену функції. Іншими словами, один аргумент не важливіший за інші. Вони чітко впорядковані, звичайно, але крім цього вони не мають семантичного впорядкування.
Однак у програмуванні ми маємо більше функцій, що визначають свободу, і в цьому випадку я можу стверджувати, що це не дуже добре. Загальна ситуація, у вас є така функція, як ця
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Дивлячись на визначення, якщо функція написана правильно, її абсолютно зрозуміло, що до чого. Під час виклику функції, у вашому IDE / редакторі може виникнути певна магія інтелісценції / заповнення коду, яка підкаже, яким повинен бути наступний аргумент. Але чекай. Якщо мені це потрібно, коли я насправді пишу дзвінок, чи не чогось тут нам не вистачає? Людина, що читає код, не має переваги IDE, і якщо вони не переходять до визначення, вони не мають уявлення, який з двох прямокутників передається як аргументи, для чого використовується.
Проблема іде навіть далі. Якщо наші аргументи походять з якоїсь локальної змінної, можуть виникнути ситуації, коли ми навіть не знаємо, що таке другий аргумент, оскільки ми бачимо лише ім'я змінної. Візьмемо для прикладу цей рядок коду
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Це полегшується різними розширеннями на різних мовах, але навіть у строго набраних мовах, і навіть якщо ви чітко називаєте свої змінні, ви навіть не згадуєте тип змінної, коли ви передаєте її у функцію.
Як зазвичай це стосується програмування, існує багато потенційних рішень цієї проблеми. Багато з них вже реалізовані популярними мовами. Наприклад, названі параметри в C #. Однак все, що мені відомо, має суттєві недоліки. Іменування кожного параметра при кожному виклику функції не може призвести до читабельного коду. Це майже відчуває, що, можливо, ми переростаємо можливості, які дає нам звичайне програмування тексту. Ми перемістилися з ПОСЛІДНОГО тексту майже в усіх областях, але все одно все-таки кодуємо те саме. Більше інформації потрібно відобразити в коді? Додайте ще текст. У будь-якому випадку це стає трохи дотичним, тому я зупинюсь тут.
Один відповідь, який я дістав до другого фрагмента коду, полягає в тому, що ви, ймовірно, спочатку розпакуйте масив до деяких названих змінних, а потім використаєте ці, але ім'я змінної може означати багато речей, а спосіб її виклику не обов'язково повідомляє вам, як це потрібно інтерпретуватися в контексті викликаної функції. У локальному масштабі у вас можуть бути два прямокутники з назвою leftRectangle та rightRectangle, оскільки це вони семантично представляють, але це не потрібно поширюватись на те, що вони представляють, коли вони задані функції.
Насправді, якщо ваші змінні названі в контексті викликаної функції, ви вводите менше інформації, ніж ви, можливо, могли б викликати цю функцію і на якомусь рівні, якщо це призведе до коду гіршого коду. Якщо у вас є процедура, в результаті якої прямокутник, який ви зберігаєте в rectForClipping, а потім інша процедура, що забезпечує rectForDrawing, то фактичний виклик DrawRectangleClipped - це просто церемонія. Рядок, який не означає нічого нового, і чи просто там, щоб комп'ютер знав, що саме ви хочете, хоча ви вже пояснили це своїм іменем. Це не дуже добре.
Я дуже хотів би почути нові перспективи щодо цього. Я впевнений, що я не перший, хто розглядав цю проблему, тож як вона вирішується?