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

Вниз

структура?   Найти похожие ветки 

 
Компромисс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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.008 c
2-1382887071
Vatolin
2013-10-27 19:17
2014.10.12
Установка компоненты


15-1394095025
Demo
2014-03-06 12:37
2014.10.12
Категории в должности


15-1393533002
Юрий
2014-02-28 00:30
2014.10.12
С днем рождения ! 28 февраля 2014 пятница


15-1394137803
Юрий
2014-03-07 00:30
2014.10.12
С днем рождения ! 7 марта 2014 пятница


15-1393673749
Ю.В.
2014-03-01 15:35
2014.10.12
Выбор принтера