Ця стаття « Як писати неможливий код» висвітлює деякі найяскравіші техніки, відомі людині. Деякі з моїх улюблених:
Нове використання імен для немовлят
Придбайте копію книги з іменами для дітей, і ви ніколи не втратите імен змінних. Фред - чудове ім’я, і його легко набрати. Якщо ви шукаєте імена змінних, які легко ввести, спробуйте adsf або aoeu, якщо ви вводите текст за допомогою клавіатури DSK.
Творча міс-орфографія
Якщо вам потрібно використовувати описові імена змінних та функцій, помилково напишіть їх. Помилковим написанням в одних іменах функцій та змінних та правильним написанням в інших (наприклад, SetPintleOpening SetPintalClosing) ми ефективно заперечуємо використання методів пошуку grep або IDE. Це працює надзвичайно добре. Додайте міжнародного смаку, пишучи торі або торі в різних театрах / театрах.
Будьте абстрактними
У функціях і змінних імен використовуйте такі абстрактні слова, як усе, все, дані, обробляйте, виконуйте, виконуйте, виконуйте та цифри, наприклад.
Капіталізація
Випадково пише велику літеру першою буквою складу в середині слова. Наприклад ComputeRasterHistoGram ().
Малі літери l схожі на цифру 1
Використовуйте нижній регістр l для позначення довгих констант. наприклад, 10л частіше приймають за 101, ніж 10л. Заборонити будь-які шрифти, що однозначно роз'єднують uvw wW gq9 2z 5s il17 |! J oO08 `'";,. M nn rn {[()]}. Будьте креативні.
Утилізуйте свої змінні
Скрізь, де дозволяють правила обсягу, повторно використовуйте наявні не пов'язані імена змінних. Подібним чином використовуйте ту саму тимчасову змінну для двох не пов’язаних цілей (для збереження слотів стека). Для диявольського варіанту перетворіть змінну, наприклад, призначте значення змінної у верхній частині дуже довгого методу, а потім десь посередині змініть значення змінної тонким способом, наприклад, перетворивши її з координата на основі 0 до координати на основі 1. Будьте впевнені, щоб не задокументувати цю зміну значення.
Cd wrttn wtht vwls s mch trsr
Використовуючи абревіатури всередині назв змінних або методів, розірвіть нудьгу кількома варіантами одного і того ж слова і навіть час від часу пишете це від руки. Це допомагає перемогти тих ледачих бомжів, які використовують текстовий пошук, щоб зрозуміти лише деякі аспекти вашої програми. Розгляньте варіантні написання як варіант виверту, наприклад, змішання міжнародного кольору з американським кольором та кулер-мовою. Якщо ви пишете імена повністю, існує лише один можливий спосіб написання кожного імені. Ці програми занадто легко запам’ятати програмісту з обслуговування. Оскільки існує так багато різних способів скоротити слово із абревіатурами, ви можете мати кілька різних змінних, які мають одне і те ж очевидне призначення. Як додатковий бонус програміст технічного обслуговування може навіть не помітити, що це окремі змінні.
Невідомі посилання на фільми
Використовуйте імена констант, такі як LancelotsFavouriteColour, замість синього, і присвоюйте йому шістнадцяткове значення $ 0204FB. Колір на екрані виглядає ідентично чистому блакитному, і програмісту з технічного обслуговування доведеться розробити 0204FB (або скористатися яким-небудь графічним інструментом), щоб знати, як він виглядає. Тільки той, хто добре знайомий з Монті Пайтоном і Святим Граалем, знав би, що улюбленим кольором Ланселота був синій. Якщо програміст з технічного обслуговування не може цитувати цілі фільми про Монті Пайтона з пам'яті, він або вона не займається програмуванням.
Документуйте очевидне
Додайте код коментарями типу / *, додайте 1 до i * /, однак, ніколи не документуйте шерстяні речі, такі як загальна мета пакета чи методу.
Документ Як ні чому
Документуйте лише деталі того, що робить програма, а не те, що вона намагається досягти. Таким чином, якщо виникла помилка, фіксатор не знатиме, що повинен робити код.
Побічні ефекти
У C функції повинні бути ідемпотентними (без побічних ефектів). Сподіваюся, цього підказки достатньо.
Використовуйте восьмеричну
Перекиньте восьмеричні літерали в список десяткових чисел, як це:
array = new int []
{
111,
120,
013,
121,
};
Розширений ASCII
Розширені символи ASCII цілком допустимі як імена змінних, включаючи символи ß, Ð та ñ. Їх майже неможливо ввести без копіювання / вставки в простий текстовий редактор.
Імена з інших мов
Використовуйте словники іноземних мов як джерело імен змінних. Наприклад, використовуйте німецький punkt для точки. Кодери технічного обслуговування, без вашого твердого розуміння німецької мови, насолоджуватимуться мультикультурним досвідом розшифровки значення.
Імена з математики
Виберіть імена змінних, які маскуються як математичні оператори, наприклад:
openParen = (slash + asterix) / equals;
Кодекс, який маскується під коментарі та навпаки
Включіть розділи коду, який коментується, але на перший погляд видається не таким.
for(j=0; j<array_len; j+ =8)
{
total += array[j+0 ];
total += array[j+1 ];
total += array[j+2 ]; /* Main body of
total += array[j+3]; * loop is unrolled
total += array[j+4]; * for greater speed.
total += array[j+5]; */
total += array[j+6 ];
total += array[j+7 ];
}
Без кольорового кодування ви помітили б, що три рядки коду коментуються?
Довільні імена, що маскуються під ключові слова
Під час документування вам потрібно довільне ім'я для подання імені файлу, використовуйте "файл". Ніколи не використовуйте очевидно довільну назву, наприклад "Charlie.dat" або "Frodo.txt". Загалом, у своїх прикладах використовуйте довільні імена, які звучать якомога більше як зарезервовані ключові слова. Наприклад, хорошими іменами для параметрів або змінних можуть бути "bank", "blank", "class", "const", "constant", "input", "key", "keyword", "kind", "output" , "параметр" "parm", "system", "type", "value", "var" і "variable". Якщо ви використовуєте фактичні зарезервовані слова для своїх довільних імен, які відхилить ваш командний процесор або компілятор, набагато краще. Якщо ви робите це добре,
Кодові назви не повинні збігатися з іменами екранів
Виберіть імена змінних, щоб вони абсолютно не мали відношення до міток, що використовуються, коли такі змінні відображаються на екрані. Наприклад, на екрані напишіть поле "Поштовий індекс", але в коді викличте відповідну змінну "zip".
Вибір найкращого оператора перевантаження
У C ++ перевантаження +, -, *, / робити речі, абсолютно не пов'язані зі складанням, відніманням тощо. Зрештою, якщо Stroustroup може використовувати оператор shift для здійснення вводу-виводу, чому б вам не бути однаково креативними? Якщо ви перевантажуєте +, переконайтесь, що ви робите це так, що i = i + 5; має зовсім інше значення від i + = 5; Ось приклад піднесення затуманення оператора перевантаження до високого мистецтва. Перевантажте "!" оператора для класу, але перевантаження не має нічого спільного з інвертуванням або запереченням. Зробіть так, щоб воно повертало ціле число. Потім, щоб отримати логічне значення для нього, ви повинні використовувати '! ! '. Однак це перевертає логіку, тому [барабан] потрібно використовувати '! ! ! '. Не плутайте! оператор, який повертає логічне значення 0 або 1, з побітовим логічним оператором заперечення.
Винятки
Я розкрию вам маловідомий секрет кодування. Винятком є біль у спині. Правильно написаний код ніколи не дає збоїв, тому винятки насправді непотрібні. Не витрачайте на них час. Винятки з підкласів призначені для некомпетентних, які знають, що їх код не вдасться. Ви можете значно спростити свою програму, маючи лише одну спробу / вловлювання у всій програмі (в основному), яка викликає System.exit (). Просто наклейте на загальний заголовок методу цілком стандартний набір кидків, незалежно від того, чи можуть вони насправді робити будь-які винятки чи ні.
Розташування магічної матриці
Використовуйте спеціальні значення в певних місцях матриці як прапори. Хорошим вибором є елемент [3] [0] в матриці перетворень, що використовується з однорідною системою координат.
Переглянуто слоти Magic Array
Якщо вам потрібно кілька змінних даного типу, просто визначте їх масив, а потім отримайте доступ до них за номером. Виберіть норму нумерації, яку знаєте лише ви, і не документуйте її. І не турбуйтеся визначати #define константи для індексів. Кожен повинен просто знати, що віджет глобальної змінної [15] - це кнопка скасування. Це лише сучасний варіант використання абсолютних числових адрес у коді асемблера.
Ніколи не красить
Ніколи не використовуйте автоматизований акуратніший вихідний код, щоб підтримувати ваш код вирівняним. Лобіюйте, щоб вони заборонили їм вашу компанію на тій підставі, що вони створюють помилкові дельти у PVCS / CVS (відстеження контролю версій) або що кожен програміст повинен мати свій власний стиль відступу, який назавжди є священним для будь-якого написаного ним модуля. Наполягайте на тому, щоб інші програмісти дотримувались цих ідіосинкратичних умовностей у "його" модулях. Заборонити прикраси досить просто, навіть незважаючи на те, що вони економить мільйони натискань клавіш, виконуючи ручне вирівнювання, і марно витрачають дні, трактуючи неправильно вирівняний код. Просто наполягайте на тому, щоб усі використовували однаковий прибраний формат не лише для зберігання в загальному сховищі, але й під час редагування. Це запускає RWAR, і бос, щоб зберегти мир, заборонить автоматичне прибирання. Без автоматичного прибирання, тепер ви можете випадково неправильно вирівняти код, щоб отримати оптичну ілюзію, що тіла петель і ifs довші або коротші, ніж вони є насправді, або що інші речення відповідають іншим, якщо вони насправді. напр
if(a)
if(b) x=y;
else x=z;
Тестування для боягузів
Хоробрий кодер обійде цей крок. Занадто багато програмістів бояться свого начальника, бояться втратити роботу, бояться ненависті споживачів і бояться бути поданими до суду. Цей страх паралізує дії та знижує продуктивність праці. Дослідження показали, що усунення фази випробування означає, що менеджери можуть заздалегідь встановлювати дати судів, що є очевидною допомогою в процесі планування. Якщо страх зник, інновації та експерименти можуть процвітати. Роль програміста полягає у створенні коду, а налагодження може здійснюватися спільними зусиллями довідкової служби та групи технічного обслуговування.
Якщо ми повністю впевнені у своїх можливостях кодування, тестування буде непотрібним. Якщо ми подивимось на це логічно, то будь-який дурень може зрозуміти, що тестування навіть не намагається вирішити технічну проблему, швидше, це проблема емоційної впевненості. Більш ефективним рішенням цієї проблеми недовіри є повне усунення тестування та направлення наших програмістів на курси самооцінки. Зрештою, якщо ми вирішили провести тестування, то ми повинні перевірити кожну зміну програми, але нам потрібно лише направити програмістів на один курс з формування самооцінки. Вигода від витрат настільки вражаюча, наскільки очевидна.
Змінити звичну справжню помилкову конвенцію
Змініть звичні визначення істинного та хибного. Звучить дуже очевидно, але це чудово працює. Ви можете приховати:
#define TRUE 0
#define FALSE 1
десь глибоко в коді, так що він виривається з надр програми з якогось файлу, на який ніхто більше ніколи не дивиться. Потім примусьте програму робити порівняння, як:
if ( var == TRUE )
if ( var != FALSE )
хтось зобов'язаний "виправити" очевидну надмірність і використовувати var в іншому місці звичайним способом:
if ( var )
Інший прийом - зробити так, щоб значення TRUE та FALSE мали одне і те ж значення, хоча більшість вважали б, що це обман і обман. Використання значень 1 і 2 або -1 і 0 є більш витонченим способом спонукати людей і все одно виглядати респектабельно. Ви можете використовувати цю саму техніку в Java, визначивши статичну константу, яка називається TRUE. Програмісти можуть бути більш підозрілими, якщо вам не вдається, оскільки в Java є вбудований літерал true.
Експлуатувати шизофренію
Java є шизофренічною щодо оголошень масивів. Ви можете зробити їх старим C, способом String x [], (який використовує змішані позначення перед постфіксом) або новим способом String [] x, який використовує чистий префікс. Якщо ви хочете справді заплутати людей, змішайте notationse.g.
byte[ ] rowvector, colvector , matrix[ ];
що еквівалентно:
byte[ ] rowvector;
byte[ ] colvector;
byte[ ][] matrix;