Форум: "Прочее";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];
Внизструктура? Найти похожие ветки
← →
ТНЕ картман (2014-03-04 15:31) [0]коль уж начали...
кто как предпочитает:
1)
function First(param: string): string;
...
function Second(param: string): string;
...
function Caller(param: string): string;
begin
result = First(Second(param));
end;
2)
function First(param; string): string;
begin
param = Second(param);
...
end;
function Second(param: string): string;
...
function Caller(param: string): string;
begin
result = First(param);
end;
← →
clickmaker © (2014-03-04 15:39) [1]это же от контекста зависит. Насколько автономны first & second
← →
Inovet © (2014-03-04 15:41) [2]Вопрос странный - несвязанные и связанные. Как надо, так и надо.
← →
ТНЕ картман (2014-03-04 15:46) [3]можно было бы одной функцией обойтись - первой нужен результат работы второй. Только для удобочитаемости разбил на несколько. Вот, интересуюсь, как читабельнее.
PS. java - на каждый чих по стопитсот созданных объектов и строк немеряно.
← →
Ega23 © (2014-03-04 15:56) [4]
function First(param; string): string;
begin
Result = Second(param);
...
end;
Тогда и с const будет норм.
← →
ТНЕ картман (2014-03-04 16:21) [5]ок, а так:
result := Func1(Func2(Func3(Func4(param))));
так кто-нть делает?
← →
clickmaker © (2014-03-04 16:24) [6]> так кто-нть делает?
зависит от длины названий функций и количества параметров. Иногда читабельней в несколько строчек разложить
← →
Inovet © (2014-03-04 16:29) [7]> [3] ТНЕ картман (04.03.14 15:46)
> можно было бы одной функцией обойтись - первой нужен результат
> работы второй.
Тогда 2.
← →
Константин © (2014-03-04 17:19) [8]
> ТНЕ картман (04.03.14 16:21) [5]
> ок, а так:
>
> result := Func1(Func2(Func3(Func4(param))));
>
> так кто-нть делает?
если обернуть так:
function SamayMaynayaFunc(param)
begin
result := Func1(Func2(Func3(Func4(param))));
end;
то почему нет?
← →
й (2014-03-04 17:49) [9]так последовательность действий как-то очевиднее:
function TMyObject.MethodX(param): TMyObject;
...
result := MyObject.Method1(param1).Metod2(param2).Method3.Method4;
← →
Inovet © (2014-03-04 18:07) [10]> [9] й (04.03.14 17:49)
Потом оказвается, что Metod2(param2) надо изменить на Metod21(param21).Metod22(param22)
Бегаем по всему коду поиском и меняем в 100500 местах. Нафига, если они всегда вызываются вместе?
← →
й (2014-03-04 18:10) [11]если они ВСЕГДА вызываются вместе - нет смысла в двух методах, достаточно одного
← →
Юрий Зотов © (2014-03-04 18:14) [12]Если Second не должна вызываться отдельно от First, то Second надо сделать внутренней в First. Так и совместный вызов будет гарантирован, и невозможность несовместного вызова тоже будет гарантирована, и читабельность кода сохранится.
Если же Second допускается вызывать отдельно, то и делать ее надо отдельной.
← →
ТНЕ картман (2014-03-04 18:50) [13]
> Юрий Зотов © (04.03.14 18:14) [12]function Root(param: string): string;
function First(param: string): string;
function Second(param: string): string;
....
begin
local_param := Second(param);
...
end;
begin
result := First(param);
end;
кошмар.
← →
brother © (2014-03-04 18:59) [14]
> кошмар.
нормальная практика...
← →
Inovet © (2014-03-04 19:12) [15]> [11] й (04.03.14 18:10)
> если они ВСЕГДА вызываются вместе - нет смысла в двух методах, достаточно одного
После затяжных праздников в думе приняли Закон о заголовках - Заголовки должны быть белыми. Программисты кинулись выискивать в программах заголовки и переделывать на
White(Str)
На следующий день в думе посмотрели на заголовки, поняли, что что-то не так надумали. Приняли поправку - Заголовки должны быть белыми заглавными буквами. Программисты кинулись переделывать
Upper(White(Str))
Ещё через день в думе, уже внимательнее рассмотрев заголовки, поняли что недодумали. Приняли поправку - Заголовки должны быть заглавными буквами.
Все кинулись выполнять указ
Upper(Str)
Но впереди предстояли очередные праздники...
Но были хитрые программисты. Они ещё из первого закона вычленили ключевые слова "заголовки" и "дума" и сделали сразу функцию.
Title(String)
которую и применили к заголовкам. В ней они и меняли сочетания других функций. По слухам, среди программистов оказаоль несколько ещё хитрее хитрых, но в жизни их никто не встречал.
← →
Pavia © (2014-03-04 19:13) [16]Правильный способ номер 1.
Есть такое правило. Есть такая вещь, как вложенность она не должна привышать двух. Если она привышает 2 то код становиться не наглядным и трудно читаемым.
А подробнее Розыч опишет.
← →
jack128_ (2014-03-04 20:16) [17]
> нормальная практика...
только IDE такое не переваривает. автокомплишн отваливается на раз.
← →
Rouse_ © (2014-03-04 20:47) [18]
> Pavia © (04.03.14 19:13) [16]
> А подробнее Розыч опишет.
Эт врятли - Розыч все еще злой на Jack128, который для заполнения одной структуры (одна штука) умудрился реализовать 4 класса (с абстрактными).
А вы тут о вложенности какой-та...
← →
Rouse_ © (2014-03-04 20:50) [19]С тебя, кстати Жек коньяк - все че ты две недели кодил, я сегодня вырезал нафих и переписал с нуля за 4 часа.
С наступающим :)
← →
картман © (2014-03-04 21:18) [20]
> Pavia © (04.03.14 19:13) [16]
>
> Правильный способ номер 1.
> Есть такое правило. Есть такая вещь, как вложенность она
> не должна привышать двух. Если она привышает 2 то код становиться
> не наглядным и трудно читаемым.
>
> А подробнее Розыч опишет.
дык, ясное дело, в машкодах вложенные функции писать та еще заморочка))
> реализовать 4 класса
> за 4 часа.
8, надо было 8 классов сделать!))
← →
Rouse_ © (2014-03-04 21:19) [21]
> картман © (04.03.14 21:18) [20]
Злые вы, уйду от вас :)
← →
Плохиш © (2014-03-04 21:32) [22]Ветка о том как ненадо программировать на любом языке.
← →
Плохиш © (2014-03-04 21:33) [23]
> PS. java - на каждый чих по стопитсот созданных объектов
> и строк немеряно.
Разруха, она в головах.
← →
jack128_ (2014-03-04 21:34) [24]
> который для заполнения одной структуры (одна штука) умудрился
> реализовать 4 класса
Толи дело розыч, который для заполнения 3 структур просто три раза скопировал программу.
← →
Rouse_ © (2014-03-04 21:55) [25]
> jack128_ (04.03.14 21:34) [24]
> Толи дело розыч, который для заполнения 3 структур просто
> три раза скопировал программу.
Розыч не пишет для сложения двух чисел полноценный фреймфорк калькулятора с обвесом :)
Оть никак ты не поймешь когда нужно быстро, а когда правильно :)
← →
Ega23 © (2014-03-04 22:07) [26]а чё калькулятор-то сразу, не, ну чё, а?
← →
Rouse_ © (2014-03-04 22:13) [27]
> Ega23 © (04.03.14 22:07) [26]
> а чё калькулятор-то сразу, не, ну чё, а?
ГЫ: ::)
http://www.youtube.com/watch?v=oeJ7_tVJWOI
← →
Pavia © (2014-03-04 22:20) [28]
> дык, ясное дело, в машкодах вложенные функции писать та
> еще заморочка))
На ассемблере создавать вложенные функции проблем нет.
Сразу скажу что сейчас изучаю язык описания аппаратуры(Это то что ниже маш.кодов), а там счёт идёт от нуля. Поэтому сбился со счёта не 1, а 2.
Я имел в виду не вложенность функций. А вложенность структуры(ну не помню как оно называется, а искать лень). Конкретно тут по скобочкам можно посчитать.
result := Func1(Func2(Func3(Func4(param))));
result := MyObject.Method1(param1).Metod2(param2).Method3.Method4;
Чаще всего названия длинные, а если ещё и вычисления, то легко запутаться.
Поэтому так не делают, а дробят функции по уму. Из редко допустимо применение With.
И вложенными делать не надо будет. Правда продумать структуры типы и классы придётся.
Обычно такие проблемы возникают из-за неправильной семантики. И решаются довольно просто перегруппировкой команд и правильным именованием функций. Если не достаточно, то заводиться новый тип данных или класс.
По поводу 4 абстрактных классов. Это перебор. Хотя тут вопрос в том к какой част программы эти структуры относятся. Одно дело это оптимизация рутины, другое дело бизнеслогика, третье основная модель.
Если вы собираетесь эту структуры таскать между разными программами то надо делать классы. Если частная оптимизация, то хватит и примитивного решения копи-пасти.
Если это костяк или скелет или фреймворк, то стоит детально уделить проработке. А если это многочисленная функция , форма, протокол которых у вас 10-100 и все разнообразны то и не стоит заниматься классами а решать как можно проще. Вообщем тут больше руководствоваться принципом достаточности.
← →
Inovet © (2014-03-04 22:25) [29]> [28] Pavia © (04.03.14 22:20)
> Сразу скажу что сейчас изучаю язык описания аппаратуры(Это
> то что ниже маш.кодов),
Это что за хрень такая?
← →
Rouse_ © (2014-03-04 22:28) [30]
> По поводу 4 абстрактных классов. Это перебор. Хотя тут вопрос
> в том к какой част программы эти структуры относятся. Одно
> дело это оптимизация рутины, другое дело бизнеслогика, третье
> основная модель.
Это карта памяти микроконтроллера, фиксированная (4096 байт). Шаг в лево/вправо - расстрел. Нужно было ее всего лишь инициализировать подобающим образом :)
← →
Rouse_ © (2014-03-04 22:30) [31]
> Inovet © (04.03.14 22:25) [29]
> Это что за хрень такая?
Даташиты судя по всему...
← →
имя (2014-03-04 22:41) [32]Удалено модератором
← →
Pavia © (2014-03-04 22:44) [33]
> > [28] Pavia © (04.03.14 22:20)> Сразу скажу что сейчас
> изучаю язык описания аппаратуры(Это > то что ниже маш.кодов),
> Это что за хрень такая?
Это HDL, их существует несколько:
VHDL и Verilog HDL.
Мало того что названия совпадают, так внутри полная хрень.
← →
й (2014-03-04 23:02) [34]Pavia, а если так:
result := MyObject
.Method1(param1)
.Metod2(param2)
.Method3.Method4;
как бы не вижу вложенности, вижу последовательность
(функции/методы обычно из многих последовательных строк/операторов состоят - это ничего, не напрягает? даже в самых строгих предписаниях позволяют экраном ограничиваться (~ 25 строк) - может, тоже до двух сократить?)
← →
й (2014-03-04 23:03) [35](забыл .Method4 тоже перенести на новую строку)
← →
Inovet © (2014-03-04 23:13) [36]> [33] Pavia © (04.03.14 22:44)
> Это HDL
Вон чё. Это типа компиляторы сразу в вентили мимо машкодов.
← →
Inovet © (2014-03-04 23:30) [37]> [36] Inovet © (04.03.14 23:13)
Кстати. Помнится, Интел свой Пентиум моделировали аппартно на мелочёвке, макет получился с такую внушительную тумбу. Дальше стало нереально аппратное моделирование, вот и стали активно внедрять такие программные методы. Так это было уже 20+ лет назад.
← →
имя (2014-03-04 23:50) [38]Удалено модератором
← →
картман © (2014-03-04 23:57) [39]Удалено модератором
← →
Компромисс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.61 MB
Время: 0.003 c