Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

Скобки при отсутствии параметров   Найти похожие ветки 

 
Григорьев Антон ©   (2004-08-11 11:51) [0]

Повышают ли они читаемость кода? Пример:

A:=SomeIdentifier;

Непонятно, то ли SomeIdentifier - это переменная, то ли функция без параметров.

A:=SomeIdentifier();

А вот тут всё ясно.

Раньше я был категорическим противником использования пустых скобок, а теперь мне всё больше и больше кажется, что с ними всё-таки лучше. А что скажет коллективный разум?


 
Sandman25 ©   (2004-08-11 11:54) [1]

Имена функций и методов должны начинаться с глагола.
Имена переменных должны быть существительными (с определяемыми словами-существительными).
Если
X := GetMyValue, то это функция.
Если
X := ResourceManagerLayout, то это переменная.


 
Гаврила ©   (2004-08-11 11:54) [2]

Согласен, тоже начал с некоторого времени ставить


 
IceBeerg ©   (2004-08-11 11:54) [3]

Согласен


 
Danilka ©   (2004-08-11 11:55) [4]


> а теперь мне всё больше и больше кажется, что с ними всё-таки
> лучше.

Чем именно лучше?


 
VMcL ©   (2004-08-11 11:56) [5]

>>Григорьев Антон ©  (11.08.04 11:51)

Я не ставлю. Тем более по имени функции часто понятно, что это именно функция, а не переменная или константа (например, GetWindowText, SetConsoleTitle). Если забыл/не знаю, что это за идентификатор, то всё равно сделаю Ctrl+Click (Find declaration) - и всё тут.


 
DiamondShark ©   (2004-08-11 11:57) [6]

Без разницы.
Главное -- писать в едином стиле.


 
NailMan ©   (2004-08-11 11:59) [7]

имхо VMcL и Sandman25 правы - надо правильные имена функциям/процедурам давать. Понятно без всяких лишних символов.

Пустые скобки портят внешний вид.

---
WBR, NailMan aka 2:5020/3337.13


 
вразлет ©   (2004-08-11 12:00) [8]

Григорьев Антон ©  

Согласись, это проблема именно Паскаля)


 
Плохиш ©   (2004-08-11 12:06) [9]


> вразлет ©   (11.08.04 12:00) [8]
> Григорьев Антон ©  
> Согласись, это проблема именно Паскаля)

У вас проблемы? Обратитесь к психиатру.


 
Игорь Шевченко ©   (2004-08-11 12:09) [10]

Григорьев Антон ©   (11.08.04 11:51)


> Раньше я был категорическим противником использования пустых
> скобок, а теперь мне всё больше и больше кажется, что с
> ними всё-таки лучше


Раньше я был категорическим сторонником круглых скобок, а теперь вычищаю, пользуясь правильными именами функций и переменных.

"Важной частью пропагандируемого мною стиля программирования является
разложение сложных процедур на небольшие методы. Если делать это неправильно,
то придется изрядно помучиться, выясняя, что же делают эти маленькие методы.
Избежать таких мучений помогает назначение методам хороших имен. Методам
следует давать имена, раскрывающие их назначение. Хороший способ для этого -
представить себе, каким должен быть комментарий к методу, и преобразовать
этот комментарий в имя метода.
Жизнь такова, что удачное имя может не сразу придти в голову. В подобной
ситуации может возникнуть соблазн бросить это занятие - в конце концов,
не в имени счастье. Это вас соблазняет бес, не слушайте его. Если вы видите,
что у метода плохое имя, обязательно измените его. Помните, что ваш код
в первую очередь предназначен человеку, а только потом - компьютеру.
Человеку нужны хорошие имена. Вспомните, сколько времени вы потратили,
пытаясь что-то сделать, и насколько проще было бы, окажись у пары методов
более удачные имена. Создание хороших имен - это мастерство, требующее
практики; совершенствование этого мастерства - ключ к превращению
в действительно искусного программиста.
То же справедливо и в отношении других элементов сигнатуры метода.
Если переупорядочивание параметров проясняет суть - выполните его."

(с) Мартин Фаулер


 
VMcL ©   (2004-08-11 12:12) [11]

>>Игорь Шевченко ©  (11.08.04 12:09) [10]

>"..." (с) Мартин Фаулер

Супер.


 
Гаврила ©   (2004-08-11 12:43) [12]

Тем не менее, даже в кодах VCL мы встречаем функции, названия которых не начинаются с глагола.
Пример - Date

Может быть, начало названия с глагола не является таки обязательным условием наименования функции ?
В таком случае скобки поиогут


 
VMcL ©   (2004-08-11 12:46) [13]

>>Гаврила ©  (11.08.04 12:43) [12]

F1 и Ctrl+Click помогут :)


 
Anatoly Podgoretsky ©   (2004-08-11 13:16) [14]

Суть то не в том, что справа Переменная, свойство, метод, функция, константа, а слева, мы хочем в левой части что то поиметь.


 
jack128 ©   (2004-08-11 13:20) [15]

когда пришлось писать на С начал ставить и в паскале. Сейчас вроде перестал..

> Тем не менее, даже в кодах VCL мы встречаем функции, названия
> которых не начинаются с глагола.
> Пример - Date
>
> Может быть, начало названия с глагола не является таки обязательным
> условием наименования функции ?
> В таком случае скобки поиогут
но в той же VCL Date используют без скобок ;-) ИМХО, лудше бы эту функцию GetDate назвали..


 
Anatoly Podgoretsky ©   (2004-08-11 13:27) [16]

Борланд тоже учится


 
GuAV ©   (2004-08-11 13:31) [17]


> Борланд тоже учится

Вы их учИте.


 
Anatoly Podgoretsky ©   (2004-08-11 13:35) [18]

Жизнь


 
Slider007 ©   (2004-08-11 13:58) [19]


> Может быть, начало названия с глагола не является таки обязательным
> условием наименования функции ?

ясен пень не является, называй как хош, только потом не обольщайся ..


 
Ihor Osov'yak ©   (2004-08-11 14:01) [20]

2 [10] Игорь Шевченко ©   (11.08.04 12:09)

Это http://www.ozon.ru/context/detail/id/1308678/ ?

Или это http://www.ozon.ru/context/detail/id/1616782/ ?

Что-то уж часто Вы этого автора вспоминаете. Заинтересовали.


 
Игорь Шевченко ©   (2004-08-11 14:08) [21]

Ihor Osov"yak ©   (11.08.04 14:01) [20]

Обе хорошие :))

Цитата - из первой книжки.

Кстати, настоятельно рекомендую прочитать (а лучше - приобрести) обе книжки Фаулера. Я не могу сказать, какая из них лучше, так как в них рассматриваются разные аспекты программирования.


 
olookin ©   (2004-08-11 14:23) [22]

А если имя функции получается непомерно большим? Например:

GetMessageIndexOfLastSuccessfulSessionDialog();

Как тут быть?


 
Danilka ©   (2004-08-11 14:25) [23]

[22] olookin ©   (11.08.04 14:23)
> Как тут быть?

Помнить, что: "краткость - сестра таланта" :))


 
Ihor Osov'yak ©   (2004-08-11 14:27) [24]

2 [21] Игорь Шевченко ©   (11.08.04 14:08)

Спасибо. Наверно так и сделаю. Кстати, по вашей наводке уже приобрел одну книгу, не жалею. Правда, времени основательно проштудировать нет, все эпизодами...


 
REA ©   (2004-08-11 14:28) [25]

Насчет хороших имен - я на этом тоже раньше не экономил, а как увидел, что Delphi в описание форм b вызовов в exe пихает так начал задумываться. Там половина программы это имена. Много не сэкономить конечно на этом, но все-таки.


 
Danilka ©   (2004-08-11 14:30) [26]


> Там половина программы это имена.

Кошмар! Это не имена, это целые поэмы. :))


 
Игорь Шевченко ©   (2004-08-11 14:33) [27]

Danilka ©   (11.08.04 14:25) [23]


> Помнить, что: "краткость - сестра таланта" :))


В данном случае талантом является прямо противоположное свойство.


 
Anatoly Podgoretsky ©   (2004-08-11 14:33) [28]

REA ©   (11.08.04 14:28) [25]
У тебя проблемы с местом на диске?


 
Danilka ©   (2004-08-11 14:36) [29]

[27] Игорь Шевченко ©   (11.08.04 14:33)
Думаю, все-таки не противоположное, а чуство меры.
Т.к. такие имена как в [22] olookin ©   (11.08.04 14:23) нисколько не прибавляют читабельности программе.


 
app ©   (2004-08-11 14:38) [30]

olookin ©   (11.08.04 14:23) [22]
Это не длинное имя, это хорошее имя, у меня не вызвало никаких проблем понять что эта функция делает.


 
Danilka ©   (2004-08-11 14:51) [31]

[30] app ©   (11.08.04 14:38)
Чем длиннее слово, тем тяжелее оно читается, тем тяжелее читается сам модуль. Уверен, что если некоторые слова убрать из названия, то в контексте модуля, где эта ф-я используется будет также все понятно. А также будет понятно, если сократить некоторые слова общепринятыми сокращениями, например, Message - Msg.


 
Игорь Шевченко ©   (2004-08-11 15:06) [32]

Danilka ©   (11.08.04 14:51) [31]

Вот небольшой набор имен:

RtlActivateActivationContextUnsafeFast
IoReportTargetDeviceChangeAsynchronous
KeGetRecommendedSharedDataAlignment
MmMapLockedPagesWithReservedMapping
PsGetProcessInheritedFromUniqueProcessId
RtlEnumerateGenericTableWithoutSplayingAvl
ExWaitForRundownProtectionReleaseCacheAware
KeAcquireInStackQueuedSpinLockRaiseToSynch

Каждое из них является самодокументированным и понятным всем пользователям.

Попробуй сократить ?


 
Danilka ©   (2004-08-11 15:24) [33]

[32] Игорь Шевченко ©   (11.08.04 15:06)
Часть этих имен из ВинАПИ, другая часть - незнаю, но тоже, вероятно, какое-нибудь АПИ.
Конечно, они должны быть во-первых уникальны в пределах всего АПИ и быть самодокументироваными также в пределах всего АПИ.
Но реально в программе они будут использоваться в каком-нибудь методе класса, всего один или пару раз, и далее, в самой программе будет использован этот класс и его методы, и тут уже так подробно рассписывать не надо будет - само назначение и имя класса будет являться частью документирования.

Несколько сумбурно, но не могли-бы Вы привести пример Вашего кода, ваших имен процедур и функций, из секции implementation? Неужели там есть сравнимые по размеру?


 
olookin ©   (2004-08-11 15:32) [34]

[30] app ©   (11.08.04 14:38)
Это не длинное имя, это хорошее имя, у меня не вызвало никаких проблем понять что эта функция делает.

Я разумеется согласен с этим. Но попробуем представить вызов функции, куда в качестве параметров передаются другие функции. Например:

GetMessageIndexOfLastSuccessfulSessionDialog(GetMessageOfLastSuccessfulSessionDialog(),GetLastSuccessfulSessionNameAndId entifier(),
DefineDialogTypeOfLastSuccessfulSession());

Выглядит уже не очень?


 
Думкин ©   (2004-08-11 15:34) [35]

> [34] olookin ©   (11.08.04 15:32)

Ну тут либо саночки либо ехать. Видимо иерархия кривая?


 
Danilka ©   (2004-08-11 15:37) [36]

[34] olookin ©   (11.08.04 15:32)
Когда много параметров и получается длинная строка, я стараюсь ее расписать примерно так:

GetMessageIndexOfLastSuccessfulSessionDialog(
                             GetMessageOfLastSuccessfulSessionDialog(),
                             GetLastSuccessfulSessionNameAndId entifier(),
                             DefineDialogTypeOfLastSuccessfulSession());

Теперь, все более понятно. :)) Но длиннющие имена в программе - все-таки перебор, по моему скромному мнению. :))


 
Skyle ©   (2004-08-11 15:38) [37]


> Часть этих имен из ВинАПИ, другая часть - незнаю, но тоже,
> вероятно, какое-нибудь АПИ.

Тут товарищ Руссинович говорит, что имя API-функции есть Префикс_Действие_Объект. Но как таковых объектов в API почти нет (точнее, функции не являются их методами), то приходится задавать имена так.
А в случае наличия классов это можно сделать проще. Например.
fDialogForm.EnableAllItems.
Правила те же самые, наглядность ИМХО не меньше.
И не надо никаких скобочек.

P.S. Я сам знаю степень неточности в моём "рассказе про объектность API", поэтому не надо к этому придираться..;-)


 
Думкин ©   (2004-08-11 15:40) [38]


> [36] Danilka ©   (11.08.04 15:37)
> Теперь, все более понятно. :)) Но длиннющие имена в программе
> - все-таки перебор, по моему скромному мнению. :))

К сожалению, или нет, но не так. Вы не обязаны писать 5000 строк кода в день. Но хотя бы 50 но безглючных(в среднем в день, а не в среднем безглючных) - увольте. А если потом через год, то извольте в курс войти сразу, а не перекапыванием окружения.


 
jack128 ©   (2004-08-11 15:43) [39]


> 34] olookin ©   (11.08.04 15:32)
я ввожу дополинительные переменные для повышения читабельности кода.

Session := GetMessageOfLastSuccessfulSessionDialog();
SessionNameAndIdent := GetLastSuccessfulSessionNameAndIdentifier();
DialogType := DefineDialogTypeOfLastSuccessfulSession();
GetMessageIndexOfLastSuccessfulSessionDialog(Session, SessionNameAndIdent, DialogType);


 
Danilka ©   (2004-08-11 15:45) [40]

[37] Skyle ©   (11.08.04 15:38)
Угу, более понятно сказал то, что я попытался в [33].

[38] Думкин ©   (11.08.04 15:40)
Дык, если все оборачивать в классы, то это, кроме всего прочего и читабельность повысит, и избавит от длиннющих имен, как было написано в [37].


 
Игорь Шевченко ©   (2004-08-11 15:51) [41]

Danilka ©   (11.08.04 15:24) [33]


> Несколько сумбурно, но не могли-бы Вы привести пример Вашего
> кода, ваших имен процедур и функций, из секции implementation?
> Неужели там есть сравнимые по размеру?


 SessionId := dmSessions.CreateSignatoriesSession (FileName, Operation);
 dmSessions.MarkSessionLoadingComplete (SessionId);

   procedure StdStringFieldValidate(Sender: TField);

procedure TModelImplementationList.RegisterModel(
 AModelImplemetation: TdmModelTemplateData);
procedure Tdlg{SubsystemPrefix}RecEdit.EnterDataAwareControl(Sender: TObject);


То есть, имена не короткие. Хотя до MS"овских (из списка) я не дотягиваю, но там нету объектов с методами, так что если слить имена методов и классов, то по длине вполне догоню. Но за длиной я не гонюсь, мне важно, чтобы мой код понимал не только я, но и те, кто его будет по долгу службы читать


 
olookin ©   (2004-08-11 15:56) [42]

а почему бы просто не сократить само название? Применим аббревиатуру для LastSuccessfulSession = LSS. Тогда:

GetMessageIndexOfLSSDialog(GetMessageOfLSSDialog(),GetLSSNameAndIdentifier(),DefineDialogTypeOfLSS());

уже покороче? Скажете, что так не делают и ничего так не понятно? А вот пример:

GetDC();

Хотя могли бы написать и GetDeviceContext() - не так уж длинно. Зато раз (два, десять) понатыкавшись на аббревиатуру LSS, можно запомнить ее смысл...


 
Danilka ©   (2004-08-11 15:58) [43]


> если слить имена методов и классов

Имя объекта отделяется от имени метода точкой, что уже повышает читабельность, кроме того, можно использовать with.

> Но за длиной я не гонюсь, мне важно, чтобы мой код понимал
> не только я, но и те, кто его будет по долгу службы читать

До вобщем-то и я про то-же. Имя которое состоит из двух слов читается легко. Из трех немного сложнее, но еще ничего. А когда по пять-шесть, то какая тут читабельность?


 
Игорь Шевченко ©   (2004-08-11 16:04) [44]


> А когда по пять-шесть, то какая тут читабельность?


Обыкновенная. В противном случае нужно писать комментарий, объясняющий, что делает функция, если из ее названия это не следует со всей очевидностью.


 
Digitman ©   (2004-08-11 16:12) [45]


> Григорьев Антон ©   (11.08.04 11:51)  


заимей привычку именовать методы префиксами, отражающими англоязычные глаголы а-ля DoSomething (делать что-то там) - и проблем не будет, и геморрой отложится на неопр.время


 
Danilka ©   (2004-08-11 16:17) [46]

[44] Игорь Шевченко ©   (11.08.04 16:04)
Если честно, не могу вспомнить ситуацию, когда метод/свойство класса, необходимо расписывать пятью-шестью словами.


 
Игорь Шевченко ©   (2004-08-11 16:32) [47]

Danilka ©   (11.08.04 16:17) [46]


> Если честно, не могу вспомнить ситуацию, когда метод/свойство
> класса, необходимо расписывать пятью-шестью словами.


имена методов:

DrawTextBiDiModeFlagsReadingOnly
UseRightToLeftAlignment
UseRightToLeftReading
UseRightToLeftScrollBar

Это у Borland


 
GuAV ©   (2004-08-11 19:31) [48]

Пора переименовать Now в GetCurrentMomentDatetime :-)


 
Андрей Сенченко ©   (2004-08-11 19:49) [49]

olookin ©   (11.08.04 15:56) [42]
а почему бы просто не сократить само название? Применим аббревиатуру для LastSuccessfulSession = LSS. Тогда:

Просматривая этот участок кода месяцев через 5-6 сможешь вспомнить что имел ввиду под этой аббревиатурой ? Сомневаюсь. Через пару недель - и то не сразу вспомнишь.

GuAV ©   (11.08.04 19:31) [48]
Пора переименовать Now в GetCurrentMomentDatetime :-)
Кто ж мешает ? Соберите себе служебный юнит из таких вещей, подключайте его к новым проектам и работайте.


 
TUser ©   (2004-08-11 20:21) [50]

Обозначения д.б. понятны писавшему. Остальное - от лукавовго.


 
jack128 ©   (2004-08-11 20:23) [51]

> Обозначения д.б. понятны писавшему. через год.  ;-)


 
TUser ©   (2004-08-11 20:28) [52]

Через год стиль прграммирования может сильно измениться.


 
jack128 ©   (2004-08-11 20:41) [53]


> Через год стиль прграммирования может сильно измениться
Не знаю. У мя весьма часто стиль менялся, только на первых порах, когда только начинал программировать..А теперь почти не меняется...


 
Гаврила ©   (2004-08-11 20:44) [54]


> Андрей Сенченко ©   (11.08.04 19:49) [49]


> Просматривая этот участок кода месяцев через 5-6 сможешь
> вспомнить что имел ввиду под этой аббревиатурой


Хороший пример был приведен с GetDC
Если есть группа функций с одинаковой аббривеатурой, это, ИМХО, выход.
Посмотришь первый раз через 5-6 месяцев на функцию, прочтешь комментарий, для остальных функций группы все будет понятно без сомментария.
Опять же
не MessageBox_IconInformation, а MB_IconInformation, от первоисточника, так сказать. Это константа а не функция, но смысл не меняется


 
Sergey Masloff   (2004-08-11 20:44) [55]

Я всегда ставлю скобки ()


 
Гаврила ©   (2004-08-11 20:48) [56]

Кстати, если не ошибаюсь, возможность ставить пустые скобки появилась относительно недавно, в ранних версиях delphi такого не было


 
TUser ©   (2004-08-11 21:05) [57]

А в других язаках (С/VB) было всегда.


 
Sergey Masloff   (2004-08-11 21:09) [58]

Гаврила ©   (11.08.04 20:48) [56]
>возможность ставить пустые скобки появилась относительно недавно
В Delphi4 насколько я помню.


 
jack128 ©   (2004-08-11 21:10) [59]


> А в других язаках (С/VB) было всегда
как в VB не знаю, а в сях НЕ ставить скобки нельзя. Точнее можно, но вызова функции не будет..


 
Гаврила ©   (2004-08-11 21:23) [60]


> Точнее можно, но вызова функции не будет..


Это как ?
То есть откомпилируется, но будет неправильно работать ? без вызова ???


 
jack128 ©   (2004-08-11 21:41) [61]


> То есть откомпилируется, но будет неправильно работать ?
> без вызова ???
в си имя функции без скобок трактуется как указатель на функцию.

int SameFunc()
{
 return true;
}

SameFunc;  - эта запись трактуется как @SameFunc в Delphi


 
GuAV ©   (2004-08-11 22:42) [62]

jack128 ©   (11.08.04 21:41) [61]

Так это в деклараии, а в вызове вроде можно ?


 
jack128 ©   (2004-08-11 22:57) [63]


> Так это в деклараии, а в вызове вроде можно ?
Щас студию снёс, но так было! "Зуб даю" (c) .
Даже варнинг какой то был по этому поводу... Помоему, что то про код в старом стиле "С"


 
GuAV ©   (2004-08-11 23:02) [64]


> Щас студию снёс

Respect ;-)


 
jack128 ©   (2004-08-11 23:30) [65]


> Respect ;-)
не за что ;-) Я её снова поставил ради такого дела :-)
#include "stdafx.h"
#include <stdio.h>

void TestFunc(void)
{
printf("test\n");
}

int main(int argc, char* argv[])
{
TestFunc;
return 0;
}
варнинг function call missing argument list и "test" не печатается..


 
GuAV ©   (2004-08-12 01:14) [66]

Хорошо. ну его этот си, если там так всё сложно ;-)
И студию снеси. Поставь ка лудше С#Bulider ;-)


 
Danilka ©   (2004-08-12 02:15) [67]

Игорь Шевченко ©   (11.08.04 16:32) [47]
Угу, я понял. Да, есть ситуации, когда это оправдано. Но все-таки, чем длиннее слово, тем тяжелее его прочитать - надеюсь с этим все согласятся? И с тем, что процент имен методов состоящих из 5-6 слов намного меньше (может, на порчдок) чем имен состоящих их 2-3 слов, что в библиотеке библиотеки Дельфи, что и у других.

Sergey Masloff   (11.08.04 20:44) [55]
Зачем?
Честно говоря, мне пустые скобки мозолят глаза.


 
Игорь Шевченко ©   (2004-08-12 09:24) [68]


> Обозначения д.б. понятны писавшему. Остальное - от лукавовго.


Только если он пишет в одиночку на коленке. Тогда конечно, он волен сам потом мучиться, вспоминая, что же имелось в виду под названиями sTmpKeyName1, sTmpKeyName2, sTmpKeyName3



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.032 c
3-1091942734
jjjjjj
2004-08-08 09:25
2004.08.29
Как сделать одно поле DBF-файла уникальным


3-1091515319
Neznayka
2004-08-03 10:41
2004.08.29
Запрос


4-1089805912
AlexR
2004-07-14 15:51
2004.08.29
Высокочастотный таймер


14-1092136775
Новенький
2004-08-10 15:19
2004.08.29
Помогите по железу


1-1092362642
Марат
2004-08-13 06:04
2004.08.29
Изменение StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский