Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Внизкак-то видел на этом форуме... Найти похожие ветки
← →
KSergey © (2004-12-15 08:11) [80]Если уж голосовать, то я за
> [70] DiamondShark © (14.12.04 20:43)
Только с поправочкой: обязательно перед вставить {B-}. Для однозначности, чтобы не было кривотолков.
Хотя, если честно, есть у меня подозрение, что код (rjvgbkbhjdfyysq b jgnbvbpbhjdfyysq) выйдет практически одинаковым: что с while, что с for
← →
Sandman25 © (2004-12-15 09:09) [81][76] Igorek © (14.12.04 23:29)
Кстати, а почему не вот так:
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
for I := Low(M) to High(M) do
if Boolean(M[I] and 1) then
begin
Result := True;
FirstOdd := M[I];
exit;
end;
Result := False;
end;
Или чтобы break остался?
← →
КаПиБаРа © (2004-12-15 09:45) [82]Exit использую часто
Break, Abort очень-очень редко
Continue, Goto не использую
← →
euru © (2004-12-15 09:56) [83]Ещё вариант:
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
i: Integer;
begin
Result := False;
for i := low(M) to high(M) do begin
Result := M[i] mod 2 = 1;
if not Result then continue;
FirstOdd := M[i];
break;
end;
end;
:)
← →
BiN © (2004-12-15 09:59) [84]Имхо, судя по исходникам (TList.IndexOf, например), код поисковой функции в исполнении борланда, вполне вероятно, мог бы быть таким:
function IndexOfOdd(const M: array of Integer; var FirstOdd: Integer):Integer;
begin
for Result:=Low(M) to High(M) do
if Odd(M[Result]) then Exit;
Result:=Low(M)-1;
end;
← →
BiN © (2004-12-15 10:00) [85]исправление BiN © (15.12.04 09:59) [84]
вместоfunction IndexOfOdd(const M: array of Integer; var FirstOdd: Integer):Integer;
конечно должно бытьfunction IndexOfOdd(const M: array of Integer):Integer;
← →
Суслик © (2004-12-15 10:17) [86]Вчера разбирал код, который написал постановщик учета в нашей системе. Язык - мой скриптовый язык. Писан давно, поэтому:
1. Процедур нет
2. Блоков нет
3. Переходы по номеру строк
Т.е. что-то вроде бейсика.
Когда смотришь такой код и видишь:
1. Ясность мысли автора
2. Надеждное решение поставленной задачи
то задумываешься - какая разница как писать. Ясность кода не в эстетической красоте, а во внутренней логике.
← →
Sandman25 © (2004-12-15 10:38) [87][86] Суслик © (15.12.04 10:17)
Не уверен, что "Ясность мысли автора" возможна при "Переходы по номеру строк".
По мере усложнения алгоритма и увеличения кода программы ясность от переходов по номерам строк будет постоянно уменьшаться. Зачем дожидаться момента, когда придется заменять все переходы на вызовы процедур, если можно сделать это сразу?
Хотя, конечно, возможны ограничения языков, когда процедур нет в принципе. На скриптовых языках обычно не пишутся длинные сложные программы.
← →
Суслик © (2004-12-15 10:42) [88]
> [87] Sandman25 © (15.12.04 10:38)
> Не уверен, что "Ясность мысли автора" возможна при "Переходы
> по номеру строк".
Ты знаешь, я сам был поражен, но это так.
Я не кассаюсь настройки системы. Так получилось, что я написал этот язык без особой цели. Но сейчас именно на нем реализована большАя часть бизнес-логики. Я знал, что на нем достаточно активно пишут. Но всегда считал, что это лабуда - типа ламеры одни. Но все не так просто оказалось. Код по аккуратности и строгости просто поражает.
На соснове просмотора более 3000 строк я нашел всего 2 ошибки и то несмертельные, скорее оформительские.
← →
kai © (2004-12-15 10:43) [89]вот еще вариант ;)
function FirstOddIdx(M: PInteger; Size: Integer): Integer;
begin
Result := Integer(M) + Size * SizeOf(Integer);
while (Integer(M) < Result) and Boolean(M^ and 1) do
Inc(M);
Result := Size - (Result - Integer(M)) div SizeOf(Integer);
end;
если не найдено, то Result = Size
← →
Dmitriy O. © (2004-12-15 10:45) [90]На счет Exit Break GOTO
воще все эти операторы очень нужны.
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда
← →
KSergey © (2004-12-15 10:46) [91]> [89] kai © (15.12.04 10:43)
> вот еще вариант ;)
А чем он отличается? Ну кроме прототипа самой функции? (что не соответствует условиям)
← →
Суслик © (2004-12-15 10:47) [92]
> [90] Dmitriy O. © (15.12.04 10:45)
Эттта, надоел уже провокации устраивать :)))))
← →
Плохиш © (2004-12-15 10:49) [93]
>Суслик © (15.12.04 10:47) [92]
>> [90] Dmitriy O. © (15.12.04 10:45)
>Эттта, надоел уже провокации устраивать :)))))
Да вся ветка одна сплошная провокация и флуд
← →
Sandman25 © (2004-12-15 10:50) [94][88] Суслик © (15.12.04 10:42)
На соснове просмотора более 3000 строк я нашел всего 2 ошибки и то несмертельные, скорее оформительские.
Тут я вижу всего два варианта. Либо ты гений "ассемблероподобных" языков (без иронии), либо переходов по номеру строки там было довольно мало, не больше нескольких десятков.
← →
kai © (2004-12-15 10:50) [95]KSergey © (15.12.04 10:46) [91]
каким-таким условиям?
на входе - адрес массива (@M), длина
на выходе - индекс, либо число равное Size, сигнализирующее о том, что элемент не найден.
отличается?... да особо ничем... можно по участкам памяти пошарить...
← →
Суслик © (2004-12-15 10:53) [96]
> [94] Sandman25 © (15.12.04 10:50)
> Либо ты гений "ассемблероподобных" языков (без иронии),
Нет. Я его плохо знаю. Думаю просто - общепрограммистский опыт.
> либо переходов по номеру строки там было довольно мало,
> не больше нескольких десятков.
до хрена.
Я не говорю, что так надо писать. Моя мысль в том, что: ясность мысли ясна в любой нотации.
Я нисколько не спорю, что поддерживать такой код очень сложно. Но от этого он не теряет своего смысла, который может быть в итоге быть переведен в delphi.
← →
KSergey © (2004-12-15 11:06) [97]> [95] kai © (15.12.04 10:50)
> каким-таким условиям?
[65] Igorek © (14.12.04 20:03)
← →
Sandman25 © (2004-12-15 11:08) [98][96] Суслик © (15.12.04 10:53)
Я нисколько не спорю, что поддерживать такой код очень сложно
Вот именно это меня и смущало, теперь все ясно и спорить не о чем :)
Для меня ясность кода заключается не только в том, что его легко понять, но и в том, что его легко поддерживать. Простейший пример - код, полученный методом copy-paste. Он может быть легкочитаемым, но ясным я бы его не назвал.
← →
kai © (2004-12-15 11:09) [99]KSergey © (15.12.04 11:06) [97]
извиняюсь, я это пропустил. ну, пусть будет нестандартный вариант -)
← →
Суслик © (2004-12-15 11:19) [100]
> [98] Sandman25 © (15.12.04 11:08)
> методом copy-paste
Как и в любой системе, так и в системе создания программных средств есть уровни. Будь то уровни абстракции, или осязаемые уровни, но они есть. Мой опыт говорит, что в создании относительно больших программных комплексов таких уровней минимум 2:
1 - реализация ядра
2 - настройка.
Совершенно не обязательно на уровне 2 заниматься настройкой системы на отельном языке или еще как-то . Это может быть тот же дельфи, но только пользоваться нужно интерфейсом, предоставляемым ядром.
На указанных уровнях могут сидеть специалисты, обладающие разными уровнями в программировании.
Как мне кажется на уровне ядра подход с копи-паст неприемлем. При доработках и модификациях нужно серьезно задумываться об повторном использовании коду. И это не дань красоте и крутости. Это есть жизненная необходимость - ядро огромный набор разных пакетов, состоящих из большого числа классов. Если начать копи-пастить, то можно привести это все в неуправляемый полет (вниз).
Другой вопрос - уровень настройки. Скажу честно, что я не вижу проблем в использовании в нем копи-паст. Поясню. Я думаю, что настройка подразумевает доработку поведения сущностей, при том, что базовое их поведение все-таки прописано в системе. Т.е. я не говорю, про случаи, когда на уровне настройки можно перестроить всю ситсему в корне. У нас другой случай. При этом такие доработки относительно небольшие: не более 1000 тыс строк. (иногда, но относительно редко больше). В этом случае такие настроечные блоки обладают особенностью быть однажды написанными и более немодифицированными. Поддержка такого кода требуется чрезвычайно редко. И если требуется, то по причине серьезных изменений в бизнес-логике. В этом случае такие блоки легче, быстрее, надежней переписать с нуля.
← →
Думкин © (2004-12-15 11:33) [101]> [100] Суслик © (15.12.04 11:19)
> При этом такие доработки относительно небольшие: не более 1000 тыс строк
Неслабо. :(
А система уровня - 1000000 млн. строк? :)
← →
Суслик © (2004-12-15 11:34) [102]
> [101] Думкин © (15.12.04 11:33)
на дельфи млн, но это ядро. Пока настройки в скриптовом языке. Сколько там, я достоверно не знаю, но много.
← →
Думкин © (2004-12-15 11:36) [103]> [102] Суслик © (15.12.04 11:34)
Триллион строк? :) Респект.
← →
Суслик © (2004-12-15 11:36) [104]
> [101] Думкин © (15.12.04 11:33)
а блин, я понял - описАлся я: конечно 1000 строк.
:)
← →
Суслик © (2004-12-15 11:37) [105]
> [103] Думкин © (15.12.04 11:36)
Хватит извеваться.
Все написано в [102] + [104]
← →
kai © (2004-12-15 11:40) [106]- поверь мне, карлсон, не строках счастье -(
- ты что - опух? а в чем же еще?
(с)
← →
Суслик © (2004-12-15 11:41) [107]
> - поверь мне, карлсон, не строках счастье -(
полностью поддерживаю.
Хорошо, чтобы их было не более 10000. Их тогда наизусть можно помнить.
Серьезно.
← →
Sandman25 © (2004-12-15 12:01) [108][100] Суслик © (15.12.04 11:19)
Ну, если поддержка требуется чрезвычайно редко, то можно с натяжкой согласиться :)
← →
megabyte-ceercop © (2004-12-15 12:23) [109]Я использую goto как заменитель break.
Сейчас делаю процедуру компиляции скрипта, так там четыре метки и около 27 goto операторов.
А используя другие методы - только запутаешься.
← →
КаПиБаРа © (2004-12-15 12:33) [110]megabyte-ceercop © (15.12.04 12:23) [109]
А используя другие методы - только запутаешься.
Приведи код этой процедуры. Посмотрим.
← →
DiamondShark © (2004-12-15 12:43) [111]Сейчас посмотрел одну свою простенькую утилиту, строк так примерно на 5000. Я в ужасе! Целых 4 break.
Я сгораю со стыда.
← →
DiamondShark © (2004-12-15 12:44) [112]
> так там четыре метки и около 27 goto операторов
Поделись кодом.
Посмотрим, чем ему можно помочь...
← →
Суслик © (2004-12-15 12:46) [113]
> [111] DiamondShark © (15.12.04 12:43)
Может удавиться?
:)
← →
Piter © (2004-12-15 17:49) [114]Dmitriy O. © (15.12.04 10:45) [90]
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда
да, авторитет нашего форума по ООП таки объяснил всем что собственно к чему
Суслик © (15.12.04 12:46) [113]
точно. Надо же когда-нибудь попробовать на себе то, что предлагаешь другим людям...
← →
Igorek © (2004-12-15 22:05) [115]Sandman25 © (15.12.04 9:09) [81]
> Кстати, а почему не вот так:
Предустановка результата функции в начале дает потом возможность использовать и break и exit. Потому кстати мой вариант и exit защищает. Да и просто привык так.
← →
panov © (2004-12-17 10:36) [116]>DiamondShark © (14.12.04 19:30) [64]
Прошу прощения за необоснованное предупреждение.
← →
ПЛОВ © (2004-12-17 10:52) [117]Мдя... Я и Exit и Break и goto использую... И ничего, компьютер не взрываеться, и не дымит :)))
Насчет ГОТО, так это, на мой взгляд, вообще замечательная весчь! Например, есть у меня некий цикл. Сколько раз его следует выполнить и когда выйти заранее неизвестно. Все выясняется по ходу... Без Эксита и Гото я б свихнулся код придумывать :))
← →
Суслик © (2004-12-17 10:55) [118]
> Без Эксита и Гото я б свихнулся код придумывать :))
дело отпыта :))
← →
GrayFace © (2004-12-19 08:56) [119]Cobalt © (13.12.04 15:08) [1]
А я тут слышал от кого-то, что Goto - дурной тон.
В этом-то есть логика. Это так, если goto использовать для выхода за пределы цикла, а потом для возврата обратно.
Однако Exit и Break дурным тоном могут называть только ламеры.
марсианин © (13.12.04 15:24) [5]
exit в блоке try-finally. работать, конечно, будет, но лучше избегать.. благо это не сложно
Ага, заменив это на goto, который - тоже, типа, дурной тон. try..finally + exit (точнее, return) очень полезны в C, чтобы одновременно и возвратить значение, и исполнить какой-то финальный код.
Кудесник © (14.12.04 11:08) [22]
кроме goto, употребления которого в Паскале действительно следует избегать... конечно, имхо :)
А почему?
ламер © (14.12.04 13:41) [28]
вот от exit пытаюсь отказаться, но пока не очень получается.
Зачем? Ник хочешь оправдать? :)
Суслик © (14.12.04 15:30) [36]
goto не пользуюсь по тем же причинам - НЕ кажется эргономичным.
насколько я понимю слово "эргономичность", такой код ему вполне удволитворяет:function ...
label done;
begin
if ... then goto done;
...
if ... then goto done;
...
done:
какие-то финальные действия
end;
Все абсолютно прозрачно - почти exit, но с какими-то действиями напоследок.
KSergey © (14.12.04 15:42) [42]
И хотя на самом деле все работает (D5, либо я что-то проглядел, мож крыж какой есть?), т.е. если после цикла используешь - даже не ругается и оптимизацию "назад" не включает (хотя когда-то точно помню натыкался на предупреждение). Вот эсти бя не было такой приписки - все было бы здорово, а так...
В данном случае, например, цикл просто нельзя перевернуть - работать будет по-другому. Однако, можно наткнуться и на случай, когда оптимизация "назад" будет сделана.
Piter © (14.12.04 22:06) [72]
Спасибо, что привел кратое содержание всех удаленных постингов DimondShark"а. Мне понравилось.
Кудесник © (15.12.04 0:56) [78]
Но не смотря на проверку бесчисленным множеством "пионэров", в указанном коде, тоже не всё так гладко, и подпорок в нём с затычками хватает и других странностей... потому, наверно, и глючат (иногда) на ровном месте...
Потому, что самые ровные места в нем написаны пионерами. Вот пример:procedure TCustomUpDown.UndoAutoResizing(Value: TWinControl);
var
OrigWidth, NewWidth, DeltaWidth: Integer;
OrigLeft, NewLeft, DeltaLeft: Integer;
begin
{ undo Window"s auto-resizing }
OrigWidth := Value.Width;
OrigLeft := Value.Left;
SendMessage(Handle, UDM_SETBUDDY, Value.Handle, 0);
NewWidth := Value.Width;
NewLeft := Value.Left;
DeltaWidth := OrigWidth - NewWidth;
DeltaLeft := NewLeft - OrigLeft;
Value.Width := OrigWidth + DeltaWidth;
Value.Left := OrigLeft - DeltaLeft;
end;
Dmitriy O. © (15.12.04 10:45) [90]
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда
Ты просто не понимаешь, зачем он нужен.
← →
марсианин © (2004-12-19 20:49) [120]
> 2GrayFace © (19.12.04 08:56)
> Ага, заменив это на goto, который - тоже, типа, дурной тон.
нет. я имел ввиду принудительный выход из try..finally вообще
а избежать можно, например, возбудив исключение.. и перехватив его за блоком. но это сложнее.
я все больше прихожу к выводу, что это нормально (принудительный выход).
по поводу виртуальных функций в конструкторе. я попробовал, все работает на ура (VS 7). функция вызывается, причем та, которая и должна.. т.е. вызов полиморфный
надо тогда еще dynamic_cast испытать
а почему Страуструп не рекомендует, причина стандартная:
"результат зависит от реализации".
к тому же, как сам говорит Страуструп его рекомендации (а равно как и нерекомендации) никогда не являются категорическими.
по поводу других случаев goto/return/break/continue я думаю так: если хочется и знаешь, что делаешь - пиши!
return/break/continue - в циклах хочется писать часто, а вот про goto вспоминаю довольно редко...
Страницы: 1 2 3 4 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.7 MB
Время: 0.054 c