Повідомлення про єдину лінію та належні практики


11

Нещодавно я придбав звичку, за якою я знаю, що багато хто з вас може нахмуритися, але, врешті-решт, допомагає мені стежити за структурою глобального коду, а не за структурою єдиного (іноді) повторюваного методу: групування числа виписок в одному рядку, як це:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

на відміну від

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Я використовую це для повторних завдань, щоб підтримувати загальний код "краси" та допомагати мені легко відстежувати структуру програми, але я визнаю, що це може бути не дуже корисною практикою. Насправді я його дуже багато використовую, тому хотів би знати, які ваші думки з цього приводу. Крім того, чи вважаєте ви, що хтось, кому колись доведеться підтримувати мій код, має проблеми з таким підходом?


5
Це може бути хорошим питанням для codereview.stackexchange.com

1
У мене будуть проблеми, якщо я маю підтримувати. Перше, що я зробив би - це зробити CTRL + F для ";" і поставити перерву лінії. Але це тільки я :-). Мені подобається один рядок, лише якщо у мене є привід, наприклад, ініціалізувати ввімкнені властивості кількох текстових полів зі значенням за замовчуванням false: textBox1.Enabled = textBox2.Enabled = false;
Арун

2
Якщо ви задаєте питання стилю кодування, допоможе, якщо ви вкажете мову.
Калеб

3
Хоча це може не виникнути у наведеному прикладі, як ви збираєтесь поставити точку перерви на другий чи третій чи ... висловлювання, якщо ви ставите їх усі в один рядок?
Мар'ян Венема

1
А також я звик до автоматизованого форматування (Java), де код все одно набуває рівномірного вигляду.
Kwebble

Відповіді:


22

Я дійсно думаю, що читабельність сильно постраждає як для вас, так і, безумовно, для всіх, хто читає код. Все має сенс, коли ви пишете це вперше, тому що це активно в голові. Інакше, коли ви скануєте код, щоб побачити, які змінні та функції, де ... ви знищуєте власну здатність сканувати власний код. Це величезне "ні-ні", і це погано, якщо кому- небудь ще доводиться читати ваш код.

Також подумайте, як ви читаєте код. Це завжди зверху вниз, прокручування вниз. Ваш метод не поєднується з цим і навіть вводить одне з найпотворніших можливих проблем при читанні коду; прокручування по горизонталі . Ніколи не варто недооцінювати, наскільки важко це може зробити читання коду. Ви ніколи не прокручуєте горизонтально, ніколи не змушуєте людей прокручуватися горизонтально, майже в будь-якому контексті це вкрай неприродно.

Крім того, якщо ваша проблема повторюється введенням коду ... не забувайте Ctrl-C. З вашого прикладу коду може бути ефективніше вводити все вручну, але якщо вам доведеться скопіювати купу рядків в кілька разів, здається, що було б так само ефективно скопіювати рядок один плюс новий рядок, вставити його x разів і вносити зміни, менша ймовірність зробити друк також.

О, і друкарські помилки! Пошкодження читабельності вашого коду може призвести до того, що кошмар зможе знайти, яку з 50 змінних оголошень ви встановили неправильно. Більшість компіляторів зараз помиляються у номерах рядків І стовпців, але знайти помилку в рядці МНОГО простіше, ніж знайти стовпець.


2
а) Читання / сканування коду - Більшість людей під час сканування коду читають перші кілька символів рядка, а потім рухаються далі, якщо це не "цікаво", а потім читають ще пару. Помилки компілятора: Більшість випадків я трактую помилку компілятора як "Проблема з рядком <x>". тільки якщо я не можу; не можу це вмить розробити (рідко), тому я фактично прочитав помилку.
mattnz

19

Одне твердження за рядком також полегшує бачити, що змінилося в бічній стороні розбіжності.


2
Це, мабуть, найбільша причина, якщо комусь доведеться об'єднати цей код, майже всі інструменти злиття збираються полегшити ізоляцію та переміщення рядків, а не підрядки рядків.
анонім

@anon Добрий момент і щодо інструментів злиття; одне твердження на рядок означає менше конфліктів злиття для очищення.
Гюго

10

Хоча приклад цього не показує, є ще одна проблема з групуванням кількох висловлювань в одному рядку. Що робити, якщо одне із п’яти висловлювань у одному рядку кидає виняток?

Ваш слід стека буде говорити "EBlah у рядку N" ... і тепер ви не знаєте, яке з цих п'яти тверджень викинуло виняток.

(Те ж саме відбувається з надмірно довгим твердженням будь-якого виду.)


2
Ця ж концепція стосується налагодження, де деталізація, як правило, є типовим номером рядка.
Девід Хаммен

2
О, так, це може бути проблемою. "Улюблений" - це коли ви отримуєте нульовий вказівник, який втрачає щось на зразок foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(синтаксис Java / C #). Сортування через такий безлад завжди краще за допомогою додаткових ліній (та тимчасових змінних… та 2D6 Brick Of Clue для оригінального розробника).
Дональні стипендіати

7

Один вираз за рядком - це широко використовуваний стиль кодування. Як результат, більшість розробників, які дивляться на ваш код у майбутньому, ймовірно, підможуть, коли побачать кілька заяв на рядок. Коли ви звикли бачити щось в один бік, це може дезорієнтувати погляд на інший спосіб.

З цієї причини я раджу проти цього, за винятком рідкісних обставин.


4

Я востаннє робив це 25 років тому, використовуючи інтерпретовані мови на невеликих мікросхемах, що працюють з низькою тактовою швидкістю, де кожен усунутий простір або перевезення вантажів збільшував продуктивність.

Я зараз перемагаю при думці про це (хоча це було зроблено з уважної причини).

На жаль, такий код важко читати, а значить, важко підтримувати.


1
Отже, ви правильно пишете його, потім знімайте пробіл та будь-який інший засіб для "машинного копіювання". Так само, як і мінімізація JavaScript у наш час.
CaffGeek

1
Так - я написав програму для переробки вихідного коду так само - ще в 1986 році. Ще одну річ, сподіваюся, більше ніколи не потрібно робити.
швидко_віз

1

Синтаксично в цьому насправді немає нічого поганого. Це дійсно залежить від стилю кодування вашої команди.

Оскільки більша частина коду, який я бачив (включаючи код, який знаходиться у стандартних заголовках c ++) робиться таким чином, я б пішов із вашим першим методом.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

0

Це дійсно незвичний стиль кодування.

Я б рекомендував вам використовувати порожні рядки для розмежування логічних частин коду.


0

Занадто далеко вправо може створити стільки ж проблем, скільки кількох ліній.

Мені довелося зіткнутися з деякими заявами sql з десятками полів. Як правило, я ставлю по одному на рядок, але за декількох випадків я об'єднав 3 або 4 до ряду. Це здається гарною ідеєю під час розробки, коли вам доведеться кілька разів прокручувати вгору та вниз.

Я шкодую, що повернувся до цього коду. Наявність зайвих рядків просто не створює такої проблеми, тому я зазвичай прибираю її.


0

Крім того, чи вважаєте ви, що хтось, кому колись доведеться підтримувати мій код, має проблеми з таким підходом?

Поклавши руки на голову на хвилину, він використовуватиме його улюблені функції IDE Regex, щоб автоматично розділити весь цей нечитабельний код на один вислів на рядок.

Тільки швидкого огляду прикладу, який ви показали, достатньо, щоб зрозуміти, наскільки читабельнішим є другий підхід.

Набагато простіше стежити за вертикальним потоком сторінки, не маючи очей рухатися горизонтально назавжди.

Подивіться на свій приклад: ви відразу знаєте, що код - це Textвластивість різних textBoxоб'єктів, і вони містять рядок як значення. Досить прямо.


0

Я б особисто не користувався таким стилем. Узагальнити

Плюси

  • менше рядків коду для прокрутки
  • може бути використаний для семантично групування коду для вираження: "багато матеріалів про призначення". АЛЕ Ви завжди можете переробляти такий блок на функцію, якщо він занадто сильно Вас турбує.

Мінуси

  • важко читати, як правило, простіше читати код по горизонталі (скуммінг, відсутність руху очей, ...)
  • diff легко стає кошмаром, включаючи злиття
  • складніше змінити (копіювати та вставляти, коментувати, ...)
  • налагодження може бути проблемою для багатьох IDE, оскільки вони працюють на лініях замість окремих виразів.

Деякі з "мінусів" часом можуть бути плюсами. Наприклад, припустимо, що фрагмент коду має вісім послідовних операцій форми if (x > maxX) {x=maxX; peggedAny = true;}. Якщо кожна така операція легко впишеться в один рядок, я б швидше мав вісім таких рядків, ніж десятки рядків, які розділяють заяви. Якби подібні порівняння використовувались у достатній кількості, чотири заяви форми peggedAny |= pegValueMinMax(ref x, minX, maxX);можуть бути кращими, але хтось, хто читає, що повинен прочитати, pegValueMinMaxщоб побачити, що це робить.
supercat

Далі, якщо невеликий шматок рядка зміниться, "розріз" буде розглядатися як зміна всієї лінії. Якщо лінія повинна поводитися функціонально як одиниця, це було б добре. В іншому випадку, якщо семантична операція розділена на кілька рядків, зміни деяких рядків можуть вплинути на операцію способами, які не були б очевидними.
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.