Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.03;
Скачать: CL | DM;

Вниз

Читабельность кода   Найти похожие ветки 

 
MonoLife ©   (2009-11-03 07:57) [0]

В функции SomeFunc() может быть вызвана N-е количество раз другая функция, к примеру, OtherFunc(const S: string): boolean, c N-ым количеством раз измененным параметром S.
Как лучше, правильней, красивше оформить конструкцию?

function SomeFunc: boolean;
begin

//так (по моему - ужасно):
 result:=OtherFunc("abc");
 if not result then exit;
 result:=OtherFunc("def");
 if not result then exit;
 .....
 result:=OtherFunc("xyz");

//или так (не менее громоздко, но чутье подсказывает - более корректно, чем выше):
 result:= (OtherFunc("abc")) and (OtherFunc("def"))
            and (...)) and (OtherFunc("xyz"));

//или по другому?
end;


 
MBo ©   (2009-11-03 08:06) [1]

строки откуда берутся?
в список их и цикл по списку.


 
Дмитрий С ©   (2009-11-03 08:12) [2]

if OtherFunc("abc") then
if OtherFunc("def") then
if OtherFunc("ghi") then
...
if OtherFunc("uvw") then
OtherFunc("xyz")

Или по как в [1]


 
MonoLife ©   (2009-11-03 08:17) [3]


> MBo ©   (03.11.09 08:06) [1]

Такой вариант оставил напоследок, если строк для параметра шибко много будет:)

> Дмитрий С ©   (03.11.09 08:12) [2]

Действительно, еще так можно..
тогда пишем так?

result:=false;
...
if OtherFunc("uvw") then
result:=OtherFunc("xyz");


 
MonoLife ©   (2009-11-03 08:27) [4]

а так?
if OtherFunc("abc") then
if OtherFunc("def") then
...
...
if OtherFunc("uvw") then
OtherFunc("xyz")
else
result:=false;

проверка на else сработает только впоследнем условии?


 
Дуб ©   (2009-11-03 08:48) [5]

Это все полумеры. Читабельность кода и повышения индекса понятийности можно и даже нужно ввести так:

function OtherOtherFunc(s : string; b : boolean) : boolean;
begin
      Result := b and OtherFunc(s)
end;

Result := OtherOtherFunc("xyz",OtherOtherFunc("vuw",......(OtherOtherFunc("abc",true)).... .));


:)


 
MonoLife ©   (2009-11-03 08:56) [6]


> Дуб ©   (03.11.09 08:48) [5]

вы это серьезно?!
на счет читабельности этого.. эм.. мне аж как-то не по себе..
чем лучше чем
result:= (OtherFunc("abc")) and (OtherFunc("def"))  and (...)) ... and (OtherFunc("xyz"));?


 
brother ©   (2009-11-03 08:58) [7]

> вы это серьезно?!


> :)


 
MonoLife ©   (2009-11-03 09:07) [8]


> brother ©   (03.11.09 08:58) [7]

Ну, не надо, ну, зачем?.. (с)
:)


 
Alkid ©   (2009-11-03 09:11) [9]

Голосую за [1].


 
MonoLife ©   (2009-11-03 09:25) [10]


> Alkid ©   (03.11.09 09:11) [9]

Я бы тоже рад, но, возможно, в функции  OtherFunc(), добавится еще какой-нибудь параметр, поэтому [1] пока не применимо


 
Демо ©   (2009-11-03 09:34) [11]

function SomeFunc: boolean;
begin
 Result := False;
 if not OtherFunc("abc") then Exit;
 if not OtherFunc("def") then Exit;
...
 result:=OtherFunc("xyz");
end;


 
Alkid ©   (2009-11-03 09:58) [12]


> MonoLife ©   (03.11.09 09:25) [10]

Параметр вычислимый или нет? Если константный, то проблем нет.
Если неконстатнтые - я бы запихнул в массив лямбды, вычисляющие их.


 
Alx2 ©   (2009-11-03 10:14) [13]

Я бы писал подобное примерно так:

result := areValidStrings(["abc","def"]);

где areValidStrings - функция с открытым массивом на входе и проверкой, реализованной в цикле.


 
Дмитрий С ©   (2009-11-03 11:28) [14]

result:=
 OtherFunc("abc")
 and OtherFunc("def")
 ...
 and OtherFunc("xyz");


 
MonoLife ©   (2009-11-03 12:22) [15]


> Дмитрий С ©   (03.11.09 11:28) [14]

было)

> Alx2 ©   (03.11.09 10:14) [13]

тоже вариант, схожий с [1]..

> Alkid ©   (03.11.09 09:58) [12]

не константы, конечно, иначе без вопросов было б..

> в массив лямбды, вычисляющие их.

ну, в общем-то можно.. код слегка раздуется, но это не важно.. Говорю, оставлю на закуску)

> Демо ©   (03.11.09 09:34) [11]

типа первого моего варианта, только более удобоваримый)


 
clickmaker ©   (2009-11-03 12:25) [16]

function SomeFunc: boolean;
begin
 try
   OtherFunc("abc");
   OtherFunc("def");
   .....
   OtherFunc("xyz");
   Result := true;
 except
   Result := false;
 end;
end;


 
MonoLife ©   (2009-11-03 12:33) [17]


> clickmaker ©   (03.11.09 12:25) [16]

О, даже так! Тоже вариант, если функция OtherFunc() способна вызвать исключение, что не факт)) ...


 
Дуб ©   (2009-11-03 12:36) [18]


> MonoLife ©   (03.11.09 12:33) [17]

Оберни в ту, которая вызовет. А все-таки такое стремление к сохранности вот такого явно не орального способа решения удивляет. :)


 
Alkid ©   (2009-11-03 12:39) [19]


> MonoLife ©   (03.11.09 12:22) [15]

Вообще вариант с комбинированием вызовов через "and" самый простой.
Главное - в записать вызовы так, что бы табличку образовывали. Еще и
аргументы выровнять.


Result :=
 OtherFunc(...) and
 OtherFunc(...) and
 OtherFunc(...) and
 OtherFunc(...) and
 OtherFunc(...) and
 OtherFunc(...);


 
clickmaker ©   (2009-11-03 12:41) [20]

> функция OtherFunc() способна вызвать исключение, что не
> факт)) ...

по аналогии с Win32Check можно сделать


 
Skyle ©   (2009-11-03 12:42) [21]


> MonoLife ©   (03.11.09 12:33) [17]
если функция OtherFunc() способна вызвать исключение, что не факт)) ...

Ну не факт и не факт. Но в любом случае оспорю приоритет  
clickmaker © (03.11.09 12:25) [16] :)

У меня время Москва+3.

Skyle (14:46:34 3/11/2009)

 procedure RaiseOnFail(S : String);
 begin
   if not OtherFunc(S) then
      Raise Exception.Create("");
 end;

begin
 try
   RaiseOnFail("abc");
   RaiseOnFail("def");
   ...
   RaiseOnFail("xyz");
   Result := True;
 except
   Result := False;
 end;
end;


Где тут ближайшее РАО? ;)


 
Дуб ©   (2009-11-03 12:44) [22]

> Skyle ©   (03.11.09 12:42) [21]

Готов быть свидетелем. В качестве доказательной базы приведу логи аськи! За мзду малую, конечнео. Не дадим РАО помереть в нищете.


 
clickmaker ©   (2009-11-03 12:44) [23]

> [19] Alkid ©   (03.11.09 12:39)

а вдруг кто-нибудь {$B+} включит? )
если над проектом трудится не один человек, еще и не такое бывает...


 
Демо ©   (2009-11-03 12:45) [24]


> MonoLife ©   (03.11.09 12:22) [15]
>
> > Демо ©   (03.11.09 09:34) [11]
>
> типа первого моего варианта, только более удобоваримый)


Нет, совершенно другого типа.
1. Исключены все лишние операции.
2. Код совершенно прозрачен и очевиден.
3. Все операции с and только загромождают код, ухудшая читабельность, но оптимизации в нём никакой нет. Напротив, при некоторых настройках лишь вызовут нерациональное расходование процессорного времени.


 
Демо ©   (2009-11-03 12:47) [25]


> Дуб ©   (03.11.09 12:36) [18]
>
> > MonoLife ©   (03.11.09 12:33) [17]
>
> Оберни в ту, которая вызовет.


Зачем? Чтобы замедлить выполнение этой функции?

Мы не ищем лёгких путей?


 
MonoLife ©   (2009-11-03 12:48) [26]


> Alkid ©   (03.11.09 12:39) [19]

эм.. выравнивание строк, блоков.. как бы, сейчас не про это.. Это само-собой... Интересно построение самой конструкции для данной ситуации.

> Дуб ©   (03.11.09 12:36) [18]
> Оберни в ту, которая вызовет.

В качестве эксперимента и демонстрации можно хоть что сделать, в т.ч. и обернуть..

> А все-таки такое стремление к сохранности вот такого явно
> не орального способа решения удивляет. :)

Оральный способ, как я понимаю, это цикл - [1] и еже с ним?:)
А вот ректальный способ мне сейчас более интересен:) И есть на то причины, хоть и слегка навязанные..
Да, и вообще, интересно же, столько решений начертания конструкции!..


 
Дуб ©   (2009-11-03 12:50) [27]

> Демо ©   (03.11.09 12:47) [25]

Ты что вот это вот все рассматриваешь как практическую часть что ли? Он не уверен, что эксепшены будут - я эту увернность в него вселил. А в реальном коде и особенно учитывая то, что вызов функции может измениться - ты вот будешь ускорять как описано что ли? Это ж кошмар копи-паста - этим студентов пугать . :)


 
Демо ©   (2009-11-03 12:50) [28]


> А вот ректальный способ мне сейчас более интересен:)


Так бы сразу и сказал - нужна не читабельность, а ректальность, и никто тут не трепался бы не по делу.


 
Дуб ©   (2009-11-03 12:51) [29]


> А вот ректальный способ мне сейчас более интересен:) И есть
> на то причины, хоть и слегка навязанные..

А...:) ну ладно. А то я и думаю, жара спала, а хочется странного. :)


 
Демо ©   (2009-11-03 12:53) [30]


> Дуб ©   (03.11.09 12:50) [27]
> > Демо ©   (03.11.09 12:47) [25]
>
> Ты что вот это вот все рассматриваешь как практическую часть
> что ли? Он не уверен, что эксепшены будут - я эту увернность
> в него вселил. А в реальном коде и особенно учитывая то,
>  что вызов функции может измениться - ты вот будешь ускорять
> как описано что ли? Это ж кошмар копи-паста - этим студентов
> пугать . :)


Копи-паст как раз наиболее подходящий метод в данном случае. -)
Если в какой-либо из функций возникает исключение, то его нужно обрабатывать применительно именно к этой функции, а не подавлять исключение.
Ладно, автор уже выразил своё отношение к своему же вопросу... Чего тут копья ломать.


 
vuk ©   (2009-11-03 12:59) [31]

Я бы ченить такое наваял...

function TestStrings(const StrArray: array of string): boolean;
var
 i: integer;
begin
 Result := true;
 for i := Low(StrArray) to High(StrArray) do
 begin
   Result := Result and OtherFunc(StrArray[i]);
   if not Result then
     break;
 end;

end;

...
TestStrings(["abc", "def", ... "xyz"]);


 
MonoLife ©   (2009-11-03 13:02) [32]


> Ладно, автор уже выразил своё отношение к своему же вопросу.
> .. Чего тут копья ломать.

ну.. кое-кто сказал, что всё это не "оральный" способ, а значит, обсуждение всего выше, по аналогии - "ректальный" способ:) Тем более, что голосующий за "оральное" в [18] не привел пример оного или не подтвердил моего предположения:)

> Демо ©   (03.11.09 12:45) [24]

не спорю ж..

> Skyle ©   (03.11.09 12:42) [21]

убедительно:)


 
MonoLife ©   (2009-11-03 13:05) [33]


> vuk ©   (03.11.09 12:59) [31]

Да! берем

> MBo ©   (03.11.09 08:06) [1]
и

> Alx2 ©   (03.11.09 10:14) [13]

получаем изящный код,с учетом, что в функции больше нет параметров, кроме S


 
Дуб ©   (2009-11-03 13:07) [34]

> Тем более, что голосующий за "оральное" в [18] не привел
> пример оного или не подтвердил моего предположения:)

Ректальное я как раз таки привел сразу же, потому что подумал что тема шуточная. И кто больше извратится. А гловное решение тут уже три раза описывали. С самого первого ответа. :) А я боюсь РАО в отличии от Вука.


 
Дуб ©   (2009-11-03 13:09) [35]


> получаем изящный код,с учетом, что в функции больше нет
> параметров, кроме S

Да хоть бы и были. Рекордами тогда.


 
Alkid ©   (2009-11-03 13:32) [36]


> clickmaker ©   (03.11.09 12:44) [23]
> а вдруг кто-нибудь {$B+} включит? )
> если над проектом трудится не один человек, еще и не такое
> бывает...

Перед кодом поставить {$B-}.


 
Alx2 ©   (2009-11-03 13:39) [37]

> получаем изящный код,с учетом, что в функции больше нет параметров, кроме S

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


 
MonoLife ©   (2009-11-03 14:19) [38]


> потому что подумал что тема шуточная.

Да не то, чтобы совсем шуточная, но в соответствующем разделе)
Мне, дык, интересны все реализации..и подходы к ним:)



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

Текущий архив: 2010.01.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.008 c
15-1257250712
koha!
2009-11-03 15:18
2010.01.03
ищу редактор ресурсов заточенный под делфи


15-1257172006
Loky1984
2009-11-02 17:26
2010.01.03
Не запускается Delphi6


15-1257122587
Eraser
2009-11-02 03:43
2010.01.03
Протокол и GNU


2-1257934753
kyn66
2009-11-11 13:19
2010.01.03
Запуск программы(только 1 копия)


15-1257313780
Kolan
2009-11-04 08:49
2010.01.03
Делать DMClient опенсорсным?