Форум: "Прочее";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];
Внизструктура? Найти похожие ветки
← →
Компромисс1 © (2014-03-05 00:03) [40]Есть pattern fluent builder, типа
MyObject myObject = new MyObject.Builder().param1(2).param5(29).param3("St").build();
А есть anti-pattern "лезть не в свое дело", типа
MyObject myObject = MyFactory.getInstance().createObjects().get("AllObjects").getObjectByClass(MyObj ect.class);
И их надо четко различать.
Грубо говоря, нельзя вызывать методы у результата метода
obj.getMyField().getSomeMethod() должен быть заменен на obj.getMyMethod()
← →
имя (2014-03-05 00:34) [41]Удалено модератором
← →
Inovet © (2014-03-05 00:42) [42]Удалено модератором
← →
имя (2014-03-05 00:58) [43]Удалено модератором
← →
картман © (2014-03-05 01:09) [44]может кому-нибудь будет интересна книжка(судя по аннотации): http://www.piter.com/product/idealnaya-it-kompaniya-kak-iz-gikov-sobrat-komandu-programmistov?gsaid=57875&_gs_ref=c3b32a3526eecd6f05a400a4c5f0c7b0adb38230&_gs_c ttl=120
← →
Юрий Зотов © (2014-03-05 03:16) [45]> ТНЕ картман (04.03.14 18:50) [13]
Скажите, а при виде вложенных циклов Вы тоже в обморок падаете?
Если да, то проблема, похоже, в консерватории. А если нет, то чем вложенные функции менее читабельны, чем вложенные циклы?
При нормальном форматировании кода - очевидно, ничем. Зато вложенные функции имеют одно очень полезное свойство - они не могут быть вызваны вне контекста окружающей функции. Что страхует от ошибок.
← →
ТНЕ картман (2014-03-05 10:53) [46]
> Юрий Зотов © (05.03.14 03:16) [45]
>
> > ТНЕ картман (04.03.14 18:50) [13]
>
> Скажите, а при виде вложенных циклов Вы тоже в обморок падаете?
>
от циклов нет))
> чем вложенные функции менее читабельны, чем вложенные циклы
не знаю, но тем не менее:(
← →
Юрий Зотов © (2014-03-05 15:29) [47]Простейший пример. Допустим, есть многомерный массив и с каждым его элементом нужно проделать ряд достаточно сложных операций. Совокупность этих операций в итоге приводит, допустим, к некоему обновлению элемента массива, но это обновление должно происходить в определенном контексте, тоже достаточно сложном.
Рассмотрим два варианта.
1. Без встроенной функции:
procedure Proc(...);
...
begin
for i : = 0 to ...
for j := 0 to ...
for k := 0 to ...
begin
// Здесь 50 строк, создающих контекст
// Здесь еще 50 строк, обновляющих элемент массива
end;
end;
2. С встроенной функцией:
procedure Proc(...);
procedure CretateContext(...); // Важно дать осмысленное имя
begin
// Здесь 50 строк, создающих контекст
end;
procedure UpdateItem(...); // Важно дать осмысленное имя
begin
// Здесь 50 строк, обновляющих элемент массива
end;
...
begin
for i : = 0 to ...
for j := 0 to ...
for k := 0 to ...
begin
CreateContext(...);
UpdateItem(...);
end;
end;
Вроде бы, одно и то же, да не совсем. Во втором варианте, программируя каждую внутреннюю процедуру, мы сосредотачиваемся только на ее функционале и абстрагируемся от всего остального. А в первом варианте приходится держать в голове сразу все - в итоге вероятность ошибки повышается.
Ну а о том, что второй вариант гораздо читабельнее, можно даже и не говорить.
← →
clickmaker © (2014-03-05 15:38) [48]> Ну а о том, что второй вариант гораздо читабельнее, можно
> даже и не говорить
ну это ты просто заюзал возможности конкретного языка. А в принципе функциональная декомпозиция у нормальных программеров срабатывает на автомате.
← →
ТНЕ картман (2014-03-05 16:17) [49]
> Юрий Зотов © (05.03.14 15:29) [47]
красота! Как на тренировке))
Но я бы не стал делать процедуры вложенными, если они большие.
да, придумал насчет:
> А если нет, то чем вложенные функции менее читабельны, чем
> вложенные циклы?
- я не знаю, где нахожусь.
И, как писали выше(или в соседней ветке?), во вложенных не работают некоторые фишечки среды.
← →
Юрий Зотов © (2014-03-05 17:43) [50]> clickmaker © (05.03.14 15:38) [48]
> функциональная декомпозиция у нормальных программеров срабатывает
> на автомате.
Само собой. Весь вопрос в том, как ее оформить - встроенными процедурами или внешними. Я исповедую такой подход - внешними делаю те процедуры, которые могут быть вызваны из любого места и это не будет ошибкой. А в тех случаях, когда процедура не должна нигде использоваться, кроме как в определенном месте и в определенном контексте, я предпочитаю делать ее внутренней.
> ТНЕ картман (05.03.14 16:17) [49]
> Но я бы не стал делать процедуры вложенными, если они большие.
Тем самым создавая возможность их неправильного вызова.
> я не знаю, где нахожусь.
Не понял. Я столько не выпью.
:o)
← →
имя (2014-03-05 18:26) [51]Удалено модератором
← →
Pavia © (2014-03-05 19:38) [52]Никаких вложенных функций.
Лично я делаю так. Юнит в юните есть внешние процедуры и внутренние.
С фишками проблем нет, тем более всегда легко можно вынести наружу.
В VCL вложенных функций толи одна толи две не более.
> Юрий Зотов © (05.03.14 15:29) [47]
Так можно, но по моему лучше по другому.
Есть студенческая задача решения СЛАУ, решается методом Гауса. Как раз сложная работа с матрицами с 3 вложенными циклами.
Так вот вместо 3 вложенных циклов гораздо проще сделать 2 вложенных. А третий перенести в функцию.
Более грамматист вариант. Всё просто и лаконично.
procedure GouseReduction2(A:TMatrixNM);
var N,i,j:Integer;
T:TVectorN;
begin
N:=RowsCount(A);
// Прямой ход
for j:=0 to N-1 do
begin
for i:=j+1 to N-1 do
begin
T:=Copy(A.Row[j]);
Mul(T, A.Cell[i,j]);
Mul(A.Row[i], A.Cell[j,j]);
Sub(A.Row[i], T);
end;
end;
// Обратный ход
for j:=N-1 downto 0 do
begin
for i:=j-1 downto 0 do
begin
T:=Copy(A.Row[j]);
Mul(T, A.Cell[i,j]);
Mul(A.Row[i], A.Cell[j,j]);
Sub(A.Row[i], T);
end;
end;
end;
Вариант не ахти и ничего не понятно.
begin
for i:=1 to n do
begin
for j:=i+1 to n do
begin
a[j,i]:=-a[j,i]/a[i,i];
for k:=i+1 to n do a[j,k]:=a[j,k]+a[j,i]*a[i,k];
b[j]:=b[j]+a[j,i]*b[i];
end;
end;
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1 do
begin
h:=b[i];
for j:=I+1 to n do
h:=h-x[j]*a[i,j];
x[i]:=h/a[i,i];
end;
Во втором коде не понятно, что на что умножается и что для чего делиться.
И ошибиться гораздо проще. Особенно это заметно у новичков которые умножают матрицу на матрицу там легко попутать какой коэффициент на какой умножается.
← →
Pavia © (2014-03-05 19:43) [53]Уточнение, выше приведён не чистый метод Гаусса, а модификация Жордана-Гаусса.
← →
Romkin © (2014-03-06 10:53) [54]
> Уточнение, выше приведён не чистый метод Гаусса, а модификация
> Жордана-Гаусса.
Какой же это Жордан, если есть обратный ход?
http://ru.wikipedia.org/wiki/Метод_Гаусса_—_Жордана
Уфф. Я уж подумал совсем склероз у меня
← →
vuk © (2014-03-06 11:38) [55]to Pavia © (05.03.14 19:38) [52]:
> В VCL вложенных функций толи одна толи две не более.
Неправда, их там больше. Существенно больше.
← →
Павиа (2014-03-06 12:06) [56]
> Какой же это Жордан, если есть обратный ход?
Обратный ход есть у обоих.
У Жордана вычисления идут при помощи элементарных операций. А у Гаусса через обратную подстановку.
← →
Romkin © (2014-03-06 17:18) [57]
> Обратный ход есть у обоих.У Жордана вычисления идут при
> помощи элементарных операций. А у Гаусса через обратную
> подстановку.
Тьфу, блин, попутался. Увидел второй цикл с downto...
Я всегда один проход писал, с условием i<>j для ряда
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.011 c