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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.005 c
2-1257937557
Oleg1963
2009-11-11 14:05
2010.01.03
Компонент в цикле


15-1257111012
Юрий
2009-11-02 00:30
2010.01.03
С днем рождения ! 2 ноября 2009 понедельник


15-1256640147
ZeroDivide
2009-10-27 13:42
2010.01.03
IsDelphiDead.com


1-1232357960
KiLLiR
2009-01-19 12:39
2010.01.03
Как связать TDateTimePicker с системным временем?


2-1258002658
Sw
2009-11-12 08:10
2010.01.03
String





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский