Форум: "Прочее";
Текущий архив: 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