-
Вчера показывал свой код, сделали замечание о "неправильном" стиле оформления кода. Я привык писать в таком стиле: if () then begin
end;
if ()
а не
if () then
begin
end;
if ()
Что тут криминального?
-
перенесите в "прочее"
-
Кого-то должно волновать, как ты привык писать код ?
-
Если работаешь в одиночку - пиши, как хочешь. Но чтобы через пару лет не падать в обморок от своего же кода.
Если работаешь в команде - пиши так, как принято в этой команде.
-
Есть разные стили, по моему и тот и тот правильный, если конечно нет других договоренностей.
-
Второй вариант, конечно, более классический, но не вижу ничего криминального и в первом. Этож не как у Зотыча было (а почему ошибка в программе? А потому что BEGIN не на той строчке был написан ;)
-
один мальчик использовал такой стиль кода и его кошка бросила всех своих котят. а еще одна девочка тоже пользовалась таким же стилем и после этого все ее подружки брали ее на свидания в качестве некрасивой подружки!
-
> Что тут криминального?
Скобочки между if и then - лишние
-
10000 строк копания в чужом коде, особенно в лесенках {} по 5-6 уровней отучат от первого варианта в ползу второго автоматически
-
Работал как-то с человеком, исповедующим вот такой стиль:
for x:=1 to List.Count do DoSomething(List[x-1]);
Лучше б он begin в одну строчку писал, ей-богу :)
-
Лучше б он begin в одну строчку писал, ей-богу :)
лучше бы он узнал про pred и succ
-
> 10000 строк копания в чужом коде, особенно в лесенках {} > по 5-6 уровней отучат от первого варианта в ползу второго > автоматически
жмём ctrl+d и читаем всё в нормализованном виде
-
> [5] Rouse_ © (14.02.17 14:50) > Этож не как у Зотыча было (а почему ошибка в программе? > А потому что BEGIN не на той строчке был написан ;)
Я это пропустил. Это что там было такое?:)
-
> Inovet © (14.02.17 16:03) [12] > Я это пропустил. Это что там было такое?:)
Там был шикарный рассказ от дяди Юры, заканчивающийся строфой: "ну так у тебя же BEGIN не на той строке написан" :)
-
> Что тут криминального?
Правильный вот такой вот стиль:
if () { } if () then begin end;
А на все подобные замечания. Тыж-программист должен знать, что для этого есть автоформат текста. И больше не клюй мои мозги.
-
> for x:=1 to List.Count do > DoSomething(List[x-1]);
Ну это чистой воды фрик :) Наверное так писал, чтобы от других отличаться.
-
-
> Kerk © (14.02.17 15:42) [9]
Ну могло ж быть и хуже, например так: for x:=2 to List.Count+1 do
DoSomething(List[x-2]);
-
-
благо сейчас есть ctrl + D, так что любые извращенные фантазии, разве что, кроме именования идентификаторов, легко исправить.
-
> [13] Rouse_ © (14.02.17 16:43) > заканчивающийся строфой
Так там даже в стихотворной форме было?:)
Юра, не воспроизведёшь ли?
-
> Игорь Шевченко © (14.02.17 17:02) [18] > Все давно написано: > http://edn.embarcadero.com/article/10280
Значит, замечание топикстартеру сделали правильное. Ибо сказано: "Never place a begin statement on the same line with any other code." А вообще, есть сомнения в стиле написания кода - смотри генофонд и делай по образу и подобию...
-
Begin end
Легче читать, т.к. текст виден в виде блока + он должен быть со смещением - кстати в последних версиях IDE - в редакторе рисуются прямые линии от начала begin вниз до end - что также упрощает.
А я еще приставку v использую, когда обозначаю var. И g когда глобальные переменные. Код легче читать. procedure MyProc(aMyVar: integer); var vMyVar: integer;
А еще меня очень раздражает когда pas модули именуют начинают с буквы u . Зачем непонятно, есть же расширение pas и иконка. Их нереально потом искать по первой букве в Total cmd
-
Есть у меня USegmen.pas в нем есть тип TSegment и функция Segment(P0,P1:TPoint) Вот что-бы были разные имена и использую букву u. А зачем в тотале искать по алфовиту? Тем более когда есть яндекс.десктоп
-
> А зачем в тотале искать по алфовиту?
Ну как зачем, открываю папку, там куча файлов. Нажимаю первую (или первые буквы) и тотал сразу перепрыгивает на этот файл. Удобно жеж.
-
Это и в стандартном Explorer тоже есть.
А .. яндекс.десктоп - зачем, если есть тотал? Я сильно сомневаюсь что он умеет хотя бы 40% того что умеет Total Commander.
-
> Inovet © (14.02.17 19:08) [20] > По заявкам...
Реальный случай. Был у нас в команде один программист. Надо сказать, очень грамотный. Без шуток.
И вот спорили мы с ним, где надо писать begin - на той же строчке или на следующей. Не ругались конечно, а так, спорили себе потихоньку.
Писал он как-то DLL и совсем забыл, что ShareMem надо ставить первым. Ну бывает, переклинило человека - тем более, что на нем еще куча других обязанностей висела.
Естественно, полезли у него 216 и 217. Час бьется, два бьется, уже просто ошалел. И говорит мне: "Слушай, глянь незамыленным взглядом - в чем тут дело".
Я подошел и сразу увидел, что ShareMem - не первый. Но ему ничего не сказал, а сказал - иди покури, а я тут пока поковыряюь.
Конечно, через 3 минуты все заработало. Приходит Серега, офигевает и спрашивает - в чем же дело было?
И тут мой час настал! Серега - говорю - ну сколько можно твердить, что begin надо писать на отдельной строке!
Команда уписалась...
-
> [26] Юрий Зотов © (14.02.17 21:00)
Ийс! Хоть и не в стихотворноей фрме.:)
-
> Rouse_ © (14.02.17 14:50) [5] > > Второй вариант, конечно, более классический
С этим поспорю. Ещё во времена ТурбоПаскаля было понятно что второй вариант (если, конечно, использовать классические отступы) неоправдано увеличивает "ширину кода". И существенная часть кода от TurboPowerProfessional была написана именно по первому варианту. И мне он более близок. Я лично считаю, что нужно выделять конструкции if/for etc, а не просто блоки begin..end.
-
Серег, у нас в команде каждый пишет в своем стиле - очень удобно, всегда гляда на стилистику можно с ходу отмазаться при возникновении ошибки - этот гавнокод писал не я :)
-
> Rouse_ © (15.02.17 09:39) [29]
:) Но вы и не пишете и не отлаживаете программы на устройствах с малыми экранами. Ноутбуках, например. Или не дай бог на нетбуках. :) А мне приходится. :(
-
Ах, да. Очепятался в Германн © (15.02.17 02:44) [28] Второй вариант конечно же неоправданно увеличивает "высоту кода". Что на нетбуке просто ужасно смотрится.
-
> [30] Германн © (16.02.17 02:17) > на устройствах с малыми экранами
Ещё можно делать максимально длинную строку, чтобы влезала на широкий матричный принтер самым сжатым встроенным шрифтом (234 символа на строку, вроде бы), распечатывать, а потом ползать с карандашом по распечатке. Увы, такой стиль не из анекдота. И в нём обязательно должно быть понатыкано if a > 2 then b = true else b = false end
if b = true then c = false end
потому что так понятнее.
-
> [32] Inovet © (16.02.17 05:50)
Пардон
if a > 2 then b = true else b = false end if b = true then c = false end
-
Давным-давно пришлось работать с 12-строчными дисплеями по 80 символов в строке. Причем из этих 12 две служебные: одна для ввода команды и одна для отображения статуса. С тех пор держу себя в рамках, оставило неизгладимый след )
-
> 12-строчными дисплеями по 80 символов в строке. тебе еще повезло, у нас было оборудование с мониторами "четвертинками" в 12 на 40 символов... только под специализированную программу, а настраивать ее носили подключать обычный. пришлось делать удаленный просмотр на IPX/SPX (программа была под DOC и сеть только такая), просто для того чтобы узнать что там случилось (спец прога могла "вылететь" с ошибкой, а сообщение вовсе не обязательно приходилось на верхнюю видимую четверть, скорее на нижнюю невидимую). сейчас, в дельфе выставляю поле справа в 128 символов, за которое стараюсь не вылезать кодом, комментарии могут... вообще с распространением широкоформатных мониторов считаю лучшим стиль "в ширину" т.е. так if () then begin
end; хотя, если условий много, или они широкие, т.е. когда их приходится переносить на две и больше строк тогда пишу так if () and
() then
begin
end; в общем пишу так как мне кажется в конкретном случае более наглядно. не считаю что это вообще какой то отдельный стиль.
-
А подскажите, можно ли выделять отдельном цветом переменные Var, переменные аргументы, глобальные переменные, поля? Что не маркировать их при помощи приставок v, a, g, f?
Но кстати это очень удобно, причем когда ставишь приставку именно с маленькой буквы, тогда она не сливается с первой буквой имени:
fList, aList, vList, gList. Попробуйте, вам понравится.
Но T и I и E привычней с большой - TList, IList, EList
-
> Кто б сомневался © (16.02.17 16:53) [36] > А подскажите, можно ли выделять отдельном цветом переменные > Var, переменные аргументы, глобальные переменные, поля? > Что не маркировать их при помощи приставок v, a, g, f?
глобальных переменных, в принципе, быть не должно, только в виде редких исключений, разве что. поля итак принято именовать, начиная с заглавной F. аргументы, зачастую, именуют с заглавной A, хотя в VCL вроде не практикуется, но в целом, удобно. венгерская нотация - вещь удобная, но использовать только исключительно ее я бы не стал. более того, зачастую последнее время, ее использование не приветствуется.
-
Вначале лиловые скобочки выравнивались по begin, но потом кто-то кому-то настучал, и теперь они выравниваются по тому, кто левее.
Думаю можно это считать официальным разрешением на begin в конце строчки. ( моно begin в строке даже не метится синеньким кружочком )
-
Пишу практически, как сказано в гайде от производителя, только а. Отступ 3 (привык). б. Префиксами пользуюсь (тоже привык) для переменных: f - для private членов. a - для параметров. k - для лок. переменных. _ - для классовых методов. fu - для переменных под implementation.
А! И всегда пишу const перед параметром, чтобы не было соблазна использовать параметры, как локальную переменную. Иногда это нужно все же (в целях быстродействия), но у меня таких пара мест всего.
-
> Но кстати это очень удобно, причем когда ставишь приставку > именно с маленькой буквы, тогда она не сливается с первой > буквой имени:
Есть VCL, где подобные имена не приняты, следовательно, непривычны и отвлекают от анализа кода. Вся суть coding conventions состоит в том, чтобы код было легко, просто и удобно читать большинству людей.
-
Игорь Шевченко © (16.02.17 22:33) [40]
По идее это наоборот упрощает чтение. Т.к. не нужно скролить туда сюда и прыгать по переменным чтобы узнать что это property или локальная переменная или аргумент метода.
> Тимохов Дима © (16.02.17 22:19) [39]
>> k - для лок. переменных. И как это расшифровать? не variable и не local, а kkk... ?
> fu - для переменных под implementation.
Ну те кто будет разбирать ваш код, первой мыслью наверное будет тот самый fu face mem :) Других ассоциаций у меня нет :)
Префиксы должны быть такие, чтобы любому челу знающему английский, было понятно что это.. Например: 'A' = 'Argument'. 'F' = 'Field', 'V' - 'Variable', 'P' - 'Pointer', 'T' = 'Type', 'E' = 'Exception', 'I' = 'Interface'.
-
> _ - для классовых методов.
Зачем? Там же все равно нужно писать название класса TMyName.FuncName - что уже как бы говорит о том что или это class procedure. И вообще что это дает? Зачем отличать классовые процедуры от методов?
-
* или это class procedure или перечисление (enumeration)
Не могу молчать ("когда в интернете кто-то неправ").. :)
>> а. Отступ 3 (привык).
Wa-аt?
А как же клавиши Ctrl + Shift + I и Ctrl + Shift + U - они только по 2 двигают... Т.е. отступ явно должен быть из четного числа.
А как же клавиша Tab? Она же по 2 двигает...
-
> аргументы, зачастую, именуют с заглавной A, хотя в VCL вроде > не практикуется
ACol, ARow навскидку первое, что пришло в голову.
-
Кто б сомневался © (16.02.17 23:50) [41]
Сначала:
По идее это наоборот упрощает чтение. Т.к. не нужно скролить туда сюда ...
А следом:
>> k - для лок. переменных. И как это расшифровать? не variable и не local, а kkk... ?
Упс. Идея не сработала. А как же не скролить?
В итоге все таки пришлось вводить coding conventions:
'A' = 'Argument'. 'F' = 'Field', 'V' - 'Variable', 'P' - 'Pointer', 'T' = 'Type', 'E' = 'Exception', 'I' = 'Interface'.
Кто б сомневался © (17.02.17 00:02) [42] > _ - для классовых методов. Зачем?
Ну так чтобы не скролить. Или уже не работает? ;)
Поэтому Игорь и пишет о том, что лучше использовать стиль, который в VCL принят. В этом случае, если VCL смотрел, то и с остальным кодом в этом стиле парсер в голове не ломается.
Но кстати это очень удобно, причем когда ставишь приставку именно с маленькой буквы, тогда она не сливается с первой буквой имени:
В том же VCL принято писать с маленькой буквы только зарезервированные слова.
-
> Кто б сомневался © (16.02.17 23:50) [41]
Отвечу скопом: 1. k - т.к. видно хорошо. 2. _ - у меня сильно используются классовые методы, с т.ч. и виртуальные (в общем-то весь фрейморк построен на этом). Поэтому при методе часто нету имени класса. 3. fu - f по аналогии с f перед private членами, u - юнит. 4. Отступы регулируются options / editor / source options - надо ставить block indent 3, tab stops 4 7.
Дело привычки.
Еще. Не придеживаюь подхода VCL в классах: сначала private, потом protected и т.д. Пишу по смысловым группам:
> // Тема такая-то > private var fData: Integer; > public property Data: Integer read fData; > public procedure AddData(...) > > // Тема другая-то > private var fData1: Integer; > public property Data1: Integer read fData1; > public procedure AddData1(...) >
-
> Еще. Не придеживаюь подхода VCL в классах: сначала private, > потом protected и т.д. Пишу по смысловым группам:
Ты ж один пишешь, насколько я в курсе. А все стили, соглашения и т.п. - они для совместной работы.
-
> А как же клавиши Ctrl + Shift + I и Ctrl + Shift + U - они только по 2 двигают... не на 2, а на значение Editor Properties -> Block indent которое по дефолту равно 2.
> А как же клавиша Tab? Она же по 2 двигает... то же самое, но Tab Stops.
-
Сам или не сам, все равно стиль какойто вырабатывается, привычки, удобства и тп способствуют. вот префиксы мы используем для того чтобы иде "помогала", по префиксу групируются в списках, что иногда помогает. Вся остальная смысловая нагрузка - ерунда на постном масле. )) Лок переменным достаточно простого короткого названия, как и параметрам. В делфи регистронезависимость, на мой взгляд зло.
-
> Игорь Шевченко © (17.02.17 10:13) [47] > > Еще. Не придеживаюь подхода VCL в классах: сначала private, > > потом protected и т.д. Пишу по смысловым группам: > Ты ж один пишешь, насколько я в курсе. А все стили, соглашения > и т.п. - они для совместной работы.
К сожалению, до сих пор пишу один. В какой-то момент это был осознанный выбор, т.к. справляюсь. Вот именно в моем случае (много кода на одного) выработал свой стиль, привычный и понятный мне. Без него я бы сдох. Я это к тому, что согласно твоей любимой фразе... каждый овощ и т.д. (концовку не помню).
-
Тимохов Дима © (17.02.17 16:45) [50]
Согласно моей фразе всякий овощ приносит пользу будучи употреблен надлежащим образом в надлежащее время. Видимо, в твоем случае стоило раньше прочитать книгу братьев Тейксейры и Пачеко.
-
если для проекта в котором ничего не понятно вы делаете костыль, то вероятно вы используете бестпрактис этого проекта, а как результат не будете выделяться на общем фоне и нарушать хрупкий баланс и эстетику остального кода
-
стиль ничто, дизайн - гораздо важнее.
открываешь отчет строк на 1000, который надо допеределать. со стилем там все окейно, но с дизайном полный швах.
десятикратные вложенные циклы, вперемежку получение, обработка и вывод данных. потянешь за веревочку в одном месте - в ста местах дверка откроется. а со стилем все хорошо
-
> В делфи регистронезависимость, на мой взгляд зло.
Слава богу что разработчики не додумались такое извращение добавить в этот язык. Тьфу-тьфу. С точки зрения здравомыслия - какой же идиотизм с этой регистрозависимостью придумали. Когда Double <> double и когда myData и mydata это разные переменные.
Человек воспринимает большую и маленькую букву как одну и ту же, а машина нет. И ... решили угодить машине.
Ну может с древних времен, во времена С с точки зрения производительности это было целесообразно, но нафига это ввели в современные языки, такие как Java, во времена когда языки стремились (и стремятся) к обычному английскому тексту..
-
Разработчики шарпа, теже впрочем что и делфи, както вот ввели зависимость, и никто еще не умер. Странно все это. )
-
> ухты © (17.02.17 12:29) [49] > > Сам или не сам, все равно стиль какойто вырабатывается, > привычки, удобства и тп способствуют. > вот префиксы мы используем для того чтобы иде "помогала", > по префиксу групируются в списках, что иногда помогает. > Вся остальная смысловая нагрузка - ерунда на постном масле. > )) Лок переменным достаточно простого короткого названия, > как и параметрам. > В делфи регистронезависимость, на мой взгляд зло.
Всё что вам в локальной группе удобно использовать - используйте. Никто не против. А вот насчёт "В делфи регистронезависимость, на мой взгляд зло" я решительно не согласен.
-
> [54] Кто б сомневался © (18.02.17 01:33) > Когда Double <> double и когда myData и mydata это разные переменные.
Это издержки. А вот когда регистр необязателен некоторые хабивают на него совсем и у них в когде одинаковые переменные и компилятор это пропускает moiasuperperemenaia MOIASUPERPEREMENAIA а так им просто лень записывать MoiaSuperPeremenaia
Это же касается идентификаторов библиотечных переменных и функций. Компилятор ошибку не выдаёт, значит принципиально пишу как хочу, и никто мне ничё не скажет.
-
но нафига это ввели в современные языки, такие как Java,
начать надо не с языков, а с регистрозависимых файловых систем.
-
> Inovet © (18.02.17 09:35) [57]
Лично я вообще не понимаю зачем нужна "регистрозависимость" хоть где либо в программировании.
-
> Inovet © (18.02.17 09:35) [57]
> а так им просто лень записывать
А за зарплатой им не лень приходить?
-
Проблема в том, что в нашем мире, где больше одного алфавита, регистронезависимое сравнение двух строк штука настолько ненадежная, что если с этим можно не связываться, то лучше не связываться.
Так-то мне самому удобнее мыслить регистронезависимо, но жизнь не всегда делает так, как мне удобно.
-
> Kerk © (22.02.17 12:40) [61] > > Проблема в том, что в нашем мире, где больше одного алфавита, > регистронезависимое сравнение двух строк штука настолько > ненадежная, что если с этим можно не связываться, то лучше > не связываться. > > Так-то мне самому удобнее мыслить регистронезависимо, но > жизнь не всегда делает так, как мне удобно. >
Поясни сию глубокую проблему.
-
> [62] Германн © (23.02.17 03:02)
Я тут встряну. Мыслить надо регистрозависимо. Мы ведь в писменной речи регистры стараемся выдерживать, особенно в немецких языках. В коде тоже не лишнее.
-
> Inovet © (23.02.17 03:08) [63] > > > [62] Германн © (23.02.17 03:02) > > Я тут встряну. Мыслить надо регистрозависимо. Мы ведь в > писменной речи регистры стараемся выдерживать, особенно > в немецких языках. В коде тоже не лишнее. >
В коде чего? Письменная речь это одно. Текст для компилятора это другое.
-
> [64] Германн © (23.02.17 03:30) > Текст для компилятора это другое.
Текст кода для человека, а если и компилятор помогает, так ещё лучше.
-
> Германн © (23.02.17 03:02) [62]
Я отвечу песней.
function Test: Boolean; begin Result := 'We will rock you' = 'We will rock you'; end;
function Test2: Boolean; begin Result := 'WE WILL ROCK YOU'.ToLower = 'We will rock you'.ToLower; end;
Первая функция всегда возвращает True. Результат выполнения второй функции зависит от локальных настроек компьютера, на котором программа выполняется.
-
Kerk © (23.02.17 10:36) [66]
> Результат выполнения второй функции зависит от локальных > настроек компьютера, на котором программа выполняется.
Если не трудно, приведи пример, когда локальные настройки компьютера разным образом переводят в нижний регистр символы латинского алфавита ?
-
> [66] Kerk © (23.02.17 10:36)
Я совсем не понял - какое отношение строковые константы имеют к идентификаторам?
-
> Игорь Шевченко © (23.02.17 10:48) [67] > Если не трудно, приведи пример, когда локальные настройки > компьютера разным образом переводят в нижний регистр символы > латинского алфавита ?
В турецком, как минимум. Там 'I'.ToLower <> 'i' Вот как там эта буква работает (внимательно смотрим на первую букву): "INTEGER".ToLower = "ınteger"
"integer".ToUpper = "İNTEGER" > Inovet © (23.02.17 10:51) [68] > > > [66] Kerk © (23.02.17 10:36) > > Я совсем не понял - какое отношение строковые константы > имеют к идентификаторам?
А идентификаторы - это не строки? Имена файлов - это не строки?
-
> [69] Kerk © (23.02.17 11:01) > А идентификаторы - это не строки? Имена файлов - это не > строки?
Если так обобщать, то однозначно регистрозависимые должны быть компиляторы. Я только за.
-
Kerk © (23.02.17 11:01) [69]
Это для юникода ? Ты все-таки настройки скажи, любопытно проверить, как не работает регистронезависимое сравнение для нетурецких текстов.
-
У всех свое, с этим не поспорить, кому то так кому то эдак. Мы достаточно легко и не принужденно отличаем mySuperPuperVar от mysuperpupervar, ни каких проблем не испытываем. И когда пишем на шарпе это помогает, а возможности ИДЕ только в плюс.
-
> Игорь Шевченко © (23.02.17 12:36) [71]
Конечно юникод, сейчас везде юникод :) Вот тут подробно: The Motivation: The Turkish-I Problem https://msdn.microsoft.com/en-us/library/ms973919.aspx#stringsinnet20_topic5Воспроизвести легко: Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US") Console.WriteLine("Culture = {0}", Thread.CurrentThread.CurrentCulture.DisplayName); Console.WriteLine("(file == FILE) = {0}", (String.Compare("file", "FILE", true) == 0));
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR"); Console.WriteLine("Culture = {0}", Thread.CurrentThread.CurrentCulture.DisplayName); Console.WriteLine("(file == FILE) = {0}", (String.Compare("file", "FILE", true) == 0));
Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False
-
> как не работает регистронезависимое сравнение для нетурецких > текстов.
Оно, кстати, работает. Просто работает по-турецким правилам. Которые внезапно отличаются от привычных нам.
-
> [72] ухты © (23.02.17 12:37) > mySuperPuperVar от mysuperpupervar
Второе вырвиглазное и выносмозгное.
-
> [73] Kerk © (23.02.17 12:52) > (file == FILE) = True
Пардон, а это что за кострукция. Что она делает?
-
> Inovet © (23.02.17 13:26) [76]
Это не конструкция, это строка вывода программы указанной выше :) Результат сравнения двух строк.
-
> [77] Kerk © (23.02.17 13:58)
Теперь понял.:)
|