1

Тема: Форматування коду | Cтиль коду

koala написав:

Можу прискіпатися, але якщо вас влаштовує - то нас тим більше.
Єдине що - вирівнюйте код (якщо самому ліньки, то в IDE має бути кнопочка для цього) і використовуйте на форумі теги code (кнопка <>).

Zaraz 2020 rik. Mogna formatyty i meregoju, napryklad.

2

Re: Форматування коду | Cтиль коду

dot написав:
koala написав:

Можу прискіпатися, але якщо вас влаштовує - то нас тим більше.
Єдине що - вирівнюйте код (якщо самому ліньки, то в IDE має бути кнопочка для цього) і використовуйте на форумі теги code (кнопка <>).

Zaraz 2020 rik. Mogna formatyty i meregoju, napryklad.

Шкода, що тут воно вміє тільки «праву клешню ліворуч — ліву клешню праворуч», що, з моєї точки зору, не найкращий варіант оформлення коду. Мережного б'ютифаєра, що вміє робити любі моєму серцію вайтсмітсівські відступи, ще пошукати треба — поки що знайшов лише офлайнові (напр., astyle).

3 Востаннє редагувалося dot (13.10.2020 20:56:48)

Re: Форматування коду | Cтиль коду

No, V̆ajt-smytsovi ne zahaljnougyvani, tomu novatckam zhode sja i zvytcajni.

4

Re: Форматування коду | Cтиль коду

Дужки в стилі K&R корисні лише для одного: ще раз прострелити собі ногу. Попри їх масову розповсюдженість та першість порівняно з іншими варіантами розставляння дужок, насправді читання коду з ними не покращується, а погіршується. Просто треба розуміти, що це історичний артефакт тих часів, коли автори мови Сі ще толком самі не розібрались, чим, з точки зору оформлення, фігурні дужки навколо блока коду відрізняються від круглих навколо виразу, і які наслідки з цього випливають.

5

Re: Форматування коду | Cтиль коду

P.Y. написав:

... автори мови Сі ще толком самі не розібрались, чим, з точки зору оформлення, фігурні дужки навколо блока коду відрізняються від круглих навколо виразу, і які наслідки з цього випливають.

Які наслідки з цього випливають ? Мені цікаво, бо сам користую K&R стиль і ноги ще цілі.

Подякували: 0xDADA11C7, Arete, dot3

6

Re: Форматування коду | Cтиль коду

Схоже, потрібна окрема тема про стиль :) А то мені в ЛС один користувач жалується що тут не відповідають на питання. І  зараз бачу що воно так і є.  Флудильня суцільно

Подякували: leofun01, P.Y.2

7 Востаннє редагувалося P.Y. (14.10.2020 21:28:24)

Re: Форматування коду | Cтиль коду

leofun01 написав:
P.Y. написав:

... автори мови Сі ще толком самі не розібрались, чим, з точки зору оформлення, фігурні дужки навколо блока коду відрізняються від круглих навколо виразу, і які наслідки з цього випливають.

Які наслідки з цього випливають ? Мені цікаво, бо сам користую K&R стиль і ноги ще цілі.

Наприклад, те, що блок коду складніше охопити поглядом, ніж вираз. Якщо вираз уміщається в одному рядку, то блок розтягується і вертикально, і горизонтально. Якщо ми хочемо полегшити візуальний контроль парності дужок, то їх слід розмістити на якомога меншій відстані одна від одної — тобто, на одній вертикалі. Крім того, що розміщення відкриваючої дужки в значно правішій позиції збільшує цю відстань, воно ще й змушує робити горизонтальний рух очима, що збиває, коли ви пробігаєтесь уздовж лівого краю, щоб перевірити цілісність структури програми. Закономірний наслідок цього — необхідність розставляти дужки навколо блоків з одного оператора, хоча синтаксис цього не вимагає — просто інакше K&R та інші стилі з такою вадою стануть остаточно непридатними для читання. Тобто, економлячи рядок на відкриваючій дужці, ми все одно перевитрачаємось на закриваючій дужці там, де ці дужки зайві. Отже, економити такою ціною сенсу нема. Можна піти алманівським-вайтсмітсівським-ГНУшним шляхом і просто не економити. Або ще можна економити по-горстманівськи, розмістивши відкриваючу дужку в першому рядку блоку — цього разу, ціною економії буде ускладнення редагування. Тобто, краще, все ж, не економити.

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

begin
    if ... then
        begin
            ...;
            ...;
        end;
end.

У перекладі на сішний синтаксис, це виглядатиме як стиль ГНУ. Який сам по собі надлишковий — якийсь із відступів зайвий, було б добре його позбутись — вирівнявши begin та end або до заголовку, або до підлеглого блоку. Ну і відводити цілий рядок на begin теж незовсім економно — можна причепити його до попереднього рядка (не побачити п'ять літер важче, тому тут це годиться). А ще є конструкції repeat...until, case...end, зрештою, begin...end тіла програми — на все це добре лягає логіка відступів K&R. Проте, що добре для паскалю, не дуже добре для Сі: якщо end складається з трьох літер, які разом формують масивний східець, що практично торкається до попереднього відступу, то кінцева фігурна дужка тоненька — вона просто висне в повітрі (особливо якщо після неї йде не наступний оператор у цьому блоці, а наступна закриваюча дужка). Тоді як вирівнявши дужки не до рівня заголовку, а до рівня підлеглого їм блоку, в більшості випадків отримуємо візуально цілісну конструкцію.

Подякували: leofun011

8

Re: Форматування коду | Cтиль коду

Загалом, я проти використання дужок для позначення початку і кінця блоків коду. Вважаю, відступи мають виконувати цю роль (як це зроблено в Python або Haskell), але синтаксис мови { C, C++, Java, C# } змушує використовувати фігурні дужки (або інші літерали в деяких випадках) і я не маю куди викинути закриваючу дужку.
Коли { читаю | пишу } код, я не дивлюся де там дужка { відкриваюча | закриваюча }, мені вони не потрібні, зовсім. Але вони потрібні компілятору, і з цим доводиться жити. Тому відкриваюча дужка йде в кінець рядка (як begin), а закриваюча в окремий рядок (як end).

9

Re: Форматування коду | Cтиль коду

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

10

Re: Форматування коду | Cтиль коду

Загалом, я проти використання дужок для позначення початку і кінця блоків коду. Вважаю, відступи мають виконувати цю роль (як це зроблено в Python або Haskell)

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

11

Re: Форматування коду | Cтиль коду

Чому б це? Лямбди в пайтоні одновиразні тому, що ван Россум вважає багаторядкові лямбди поганим стилем (плутатина, що в що вкладене). Але немає жодних синтаксичних причин не компілювати щось таке:

[1,3,15].sort(key=lambda x:
    s = str(x)
    if len(s)>2:
        s = '_'+s
    return s
)

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

Подякували: leofun011

12 Востаннє редагувалося P.Y. (19.11.2020 01:38:47)

Re: Форматування коду | Cтиль коду

У пітонівському синтаксисі, переходи на новий рядок усередині виразу в дужках ігноруються. Таким чином, наведений вище код еквівалентний такому:

[1,3,15].sort(key=lambda x: s = str(x) if len(s)>2: s = '_'+s return s)

Щоб маркувати блок з відступами всередині виразу, очевидно, потрібен якийсь спеціальний синтаксис. Але тоді виникає питання, як маркувати кінець цього вкладеного блоку.

Ні, насправді це можна обійти, скориставшись потрійними дужками та функцією exec, що генерує функцію — проте, це вже хак:

a=[1,3,15]
a.sort(key=exec('''def _f(x):
    s = str(x)
    if len(s)>2:
        s = '_'+s
    return s
''')or _f)
print(a)
Подякували: leofun011

13

Re: Форматування коду | Cтиль коду

Ще раз: ЧИННИЙ синтаксис просто забороняє багаторядкові лямбди. Якщо говорити про ТЕОРЕТИЧНІ ЗМІНИ, то доповнити правило про перенесення в дужках лямбдами не зробить суперечностей.

14

Re: Форматування коду | Cтиль коду

koala написав:

Ще раз: ЧИННИЙ синтаксис просто забороняє багаторядкові лямбди. Якщо говорити про ТЕОРЕТИЧНІ ЗМІНИ, то доповнити правило про перенесення в дужках лямбдами не зробить суперечностей.

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

15

Re: Форматування коду | Cтиль коду

Приклад:

f=(lambda a:
    sorted(a)[-1])

Оброблена за сучасними правилами, така лямбда даватиме такий же результат, як і функція:

def f(a):
    return sorted(a)[-1]

Проте, якщо ми вводимо правило, що перенос рядка всередині лямбди є сигналом, щоб обробляти її вміст не як вираз, а як блок тіла функції, ця лямбда повертатиме не останній елемент відсортованого списку, а None, оскільки стане еквівалентною функції, яка нічого не повертає:

def f(a):
    sorted(a)[-1]
Подякували: leofun011

16

Re: Форматування коду | Cтиль коду

Гаразд, щоб задовольнити кількох збоченців, що переносять вміст лямбди на наступний рядок, можна там def писати. Так краще?

Подякували: leofun011

17 Востаннє редагувалося P.Y. (19.11.2020 13:55:46)

Re: Форматування коду | Cтиль коду

koala написав:

Гаразд, щоб задовольнити кількох збоченців, що переносять вміст лямбди на наступний рядок, можна там def писати. Так краще?

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

І це все одно повертає нас до питання, що́ має бути ознакою кінця тіла блоку, вкладеного в дужки?
Наприклад, я хочу переписати багаторядковими анонімними функціями ось це:

fns=[lambda x:x+1, lambda x:x-1]

Чи можна робити так, наприклад:

fns=[
    def(x):
        return x+1
    ,def(x):
        return x-1
    ]

Якщо взяти за основу існуюче правило для блоків з відступами, то 4-й та 6-й рядок мають бути з таким же рівнем відступу, що й рядок заголовку блоку, що закривається перед ними. Але що́ є цим «рядком заголовку» — «fns=[» (відступ 0) чи «def(x)» (відступ 4)? Якщо перше, то рядки 4 та 6 будуть помилковими, оскільки мають проміжний рівень відступу. Якщо друге, то на що саме слід рівнятись — на відступ перед рядком (який узагалі не зобов'язаний починатись зі слова def) чи на позицію самого def (прирівнюючи друковані знаки перед ним до пробілів)? В останньому випадку, рядок 6 буде помилковим, тоді як у передостанньому випадку, увесь код валідний.

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

fns=[
    lambda x:(;
        return x+1;)
    lambda x:(;
        return x-1;)]

Тут (; та ;) — спеціальні дужки для блоків усередині виразу, що обробляються як тіло вкладеної функції без параметрів і повертають результат її виклику.

Подякували: leofun011