Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1393789594
[ВладОшин]
2014-03-02 23:46
2014.10.12
Плагин. Как это работает?


15-1393878602
Юрий
2014-03-04 00:30
2014.10.12
С днем рождения ! 4 марта 2014 вторник


3-1300127315
MiAn
2011-03-14 21:28
2014.10.12
Как инициализировать динамически поля TClientDataSet


15-1393587859
alexdn
2014-02-28 15:44
2014.10.12
Как продать программу за рубеж


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





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