
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Страницы: (117) « Первая ... 14 15 [16] 17 18 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#226
,
|
|
|
Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно. Как только видишь, что ситуация в последствии может стать неоднозначной, так и пометил. В большенстве же случаев with очень даже кстати, строчки получаются короче, а значит читабельнее, не говоря уж о затратах на набор текста. Цитата Hryak @ Через годик решаем класс дополнить методом bar() - и всё тихо-тихо-незаметно ломается Ломается из-за того, что в дельфи есть with? Или все же из-за того, что применяется везде и всюду без разбора? Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функциф с таким же именем, что и стандартная ![]() Добавлено Цитата Flex Ferrum @ но писать текст программы рассчитывая на то, что он будет просматриваться/редактироваться в рамках конкретной IDE - ИМХО, ошибка Почему же? Если какая-то IDE является стандартом для предприятия, и исходники не выходят наружу, то пуркуа бы да и не па? |
Сообщ.
#227
,
|
|
|
Цитата Smike @ Взял наугад первый попавшийся чужой код с with. Мне все понятно ![]() ![]() ![]() with RGB do begin if R > 0 then R := Power(R, Gamma) else R := 0; if G > 0 then G := Power(G, Gamma) else G := 0; if B > 0 then B := Power(B, Gamma) else B := 0; end; Кстати, код, имхо, неудачный. Это называется копи-паст. Вместо того, чтобы написать функцию и три раза вызвать, тут нашли применение оператору with ![]() Так что, Smike, давай другой пример. ![]() Добавлено Или это я туплю... ![]() Не, все правильно, в глазах просто рябит от такого кода ![]() |
Сообщ.
#228
,
|
|
|
Цитата Smike @ И вот ты опять в лужу сел ![]() Нужен именно собственный, написанный ручками, ан еБорландовский и не FastMM ![]() Цитата Dantes @ В C++ union не так уж и полезен, поскольку объекты, имеющие нетривиальные конструкторы, операторы присваивания и деструкторы, не могут быть его членами. вообще-то не могут являться его челнами не-POD-типы. Зато такие конструкции прокатывают на ура: ![]() ![]() union flags { int word; struct { int fail_bit: 1; int open_bit: 1; ... }; }; |
Сообщ.
#229
,
|
|
|
Ну еще в старом добром C были макросы, с помощью которых можно сделать проще и нагляднее
![]() ![]() ![]() #define doRGBcomponent(rgb,c,gamma) rgb.c = rgb.c > 0 ? pow(rgb.c,gamma) : 0 #define doRGB(rgb,gamma) \ do { \ double __Gamma = gamma; \ doRGBcomponent(rgb,R,__Gamma); \ doRGBcomponent(rgb,R,__Gamma); \ doRGBcomponent(rgb,R,__Gamma); \ } while (0) ....... doRGB(RGB,Gamma); Хотя, принимая во внимание мощь сегодняшних редакторов кода и убогость сишных макросов, скопипастить и правда проще. |
Сообщ.
#230
,
|
|
|
Цитата Мяут @ Цитата Smike @ И вот ты опять в лужу сел ![]() Нужен именно собственный, написанный ручками, ан еБорландовский и не FastMM ![]() Борландовский действительно писали не ручками, а вот FastMM именно собственный, написанный ручками |
Сообщ.
#231
,
|
|
|
Я тоже не сталкивался. Но я и не показатель, так как на Паскале максимум что написал - так это дипломный проект в 12 тыс. строчек и не сильно там with использовал. Цитата Взял наугад первый попавшийся чужой код с with. Мне все понятно ![]() ![]() ![]() with RGB do begin if R > 0 then R := Power(R, Gamma) else R := 0; if G > 0 then G := Power(G, Gamma) else G := 0; if B > 0 then B := Power(B, Gamma) else B := 0; end; Даже если бы я не знал структуры RGB, то легко догадаться, что это именно R, G и B. Здесь понятно, но и пример это простой. Хотя от обилия R, G, B и такого равноформатированного кода действительно в глазах рябит. ![]() В C++ я бы выделил дублирующийся код в функцию и не переживал по поводу отcутствия with. Цитата Астарот Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно. Как только видишь, что ситуация в последствии может стать неоднозначной, так и пометил. Ага, не скакать дак комментарии писать. ![]() Между (сорри, что псевдокод на С++, на Паскале ломает) ![]() ![]() with (obj) { // foo, zoo - методы obj, bar - свободная функция foo(bar()); zoo(bar()); } ![]() ![]() obj.foo(bar()); obj.zoo(bar()); } Цитата Ломается из-за того, что в дельфи есть with? Или все же из-за того, что применяется везде и всюду без разбора? Что значит - без разбора? Если внутри with идет обращение только к полям и методам ссылаемого объекта - проблем нет и не будет. Однако так бывает редко. Цитата Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функцию с таким же именем, что и стандартная Ох, держите меня семеро. Толи я плохо объясняю (помогите объяснить те, кто меня понимает) или просто оппоненты не желают меня понимать. Или я действительно фигню говорю... ![]() Дело не в вероятности, а в последствиях наступления этого события. Показываю еще раз. ![]() ![]() int bar(); // некая глобальная функция ..... class SomeClass { void foo(int); int bar(); // внутри класса внешняя bar скрывается да и черт с ней, помнить о перекрытии // нужно только разработчику класса, да и то, только если он сам желает эту скрытую // функцию юзать. Но никак не пользователю класса... void zoo(); }; ..... // далеко-далеко в другом модуле черт знает какого проекта: SomeClass obj; ... // путь 1 with (obj) { foo(bar()); zoo(); } // путь 2 obj.foo(bar()); obj.zoo(); Путь 1: кто такие foo, bar и zoo по внешнему виду совсем не понятно. Ясно только, что кто-то из них - метод SomeClass (хотя, может и нет, если код отрефакторили и забыли убрать уже ненужный with ![]() Путь 2: Программисту, написавшему obj.foo(bar()); не нужно знать - есть ли, нет ли в SomeClass метод bar. Тут два варианта: а) он либо дергает глобальную функцию bar; б) если в классе, в чьем методе находится написанный код, или в его предках, есть метод bar - дергается он. Но диапазон влияющего кода - только определения этих классов, никак не ещё и определения класса SomeClass и его предков. with сразу налагает на программиста, его написавшего, ответственность за знание внутренностей with'уемого объекта, чего не требуется в первом пути (знать нужно только то, что реально используется в данном месте от этого объекта, т.е. foo и zoo). Программы пишут для того, чтобы их читать. Когда человек будет это читать и прочитает with (obj) ему придется в первую очередь бежать к определению класса SomeClass, чтобы посмотреть - а нет ли там методов foo, zoo и bar. Во втором пути ему это делать не придется, т.к. сразу видно, что foo и zoo являются методами SomeClass, а bar - не является (а даже если и является - как в данном случае - то это фиолетово для этого кода). Разделяй и властвуй и не помни о ненужных деталях. |
Сообщ.
#232
,
|
|
|
Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей".
|
Сообщ.
#233
,
|
|
|
Вообще на мой взгляд, тут не совсем в правилах поиска имен дело, сколько в инкапсуляции. У любого класса с точки зрения ООП есть интерфейс и реализация, ведь так. Так вот чтобы обратится через интерфейс к реализации, я должен указать имя объекта и имя метода. Все предельно просто. Используя with, в программу вносится неопределенность, такая же как если бы программист на C++ написал using namespace std; - ведь интерфейс становится не частью класса, а достояние всей глобальной области видимости.
with'ом, да пользользовался. В конце концов слегка запутался. Больше не буду ![]() |
Сообщ.
#234
,
|
|
|
Цитата Flex Ferrum @ Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей". Не, ну должны же и в Делфи быть подобные правила... ![]() |
![]() |
Сообщ.
#235
,
|
|
Цитата Hryak @ Или я действительно фигню говорю... М-м... Цитата Flex Ferrum @ Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей" Ни в жисть не осилят ![]() Не знаю уже, как остальные сторонники сипипи, отметившиеся здесь, но г-н Hryak честно признался в незнании ненавистного ему паскаля. Хорошо знающий язык, опытный программист никогда не будет испытывать трудностей, которые здесь живописали. Пишущему на паскале сипипи всегда будет китайской грамотой, равно как и наоборот. Былой опыт не считается. Все эти споры о закорючках на самом деле со стороны смотрятся довольно нелепо. Я могу так говорить, так как давно не пишу на сипипи и еще давнее не пишу на паскале (на дельфи не пришлось, Бог миловал, - не люблю RAD'ы). Если бы речь шла о качествах компилятора или получаемого кода или каких-то уникальных фичах, присущих тому или иному языку, еще бы можно было понять, а так... ![]() |
![]() |
Сообщ.
#236
,
|
|
Цитата Астарот @ угу, вот в с++ для этого сделаны namespaces... и только инаковерующие в каждом модуле первой строкой после include'ов пишут using namespace std; кстати, а что с namespace'ами в ОПаскале? Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функциф с таким же именем, что и стандартная ![]() ![]() Цитата Астарот @ типа коментарий написать проще, чем имя объекта перед именем члена?Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно Цитата wind @ сколько уже было сказано... template тот же... сейчас в c++ без них жизни не видят, а в ОПаскале всё извращаются, да извращаются...или каких-то уникальных фичах, присущих тому или иному языку, еще бы можно было понять, а так... ![]() Цитата wind @ ну я вот никак не признаю... я очень хорошо знал паскаль... сипипи считал китайской грамотой, но делал попытки понять его... понять удалось, стал опаскаль китайской грамотой считать... Пишущему на паскале сипипи всегда будет китайской грамотой, равно как и наоборот. |
Сообщ.
#237
,
|
|
|
Цитата Flex Ferrum @ Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей". О чем речь? Любой программист до этого дойдет с опытом, если конечно его опыт будет идти ему на пользу. Hryak почему-то упирает на проблему с распознаванием методов класса и обычных процедур внутри блока with. Я же в упор не вижу здесь проблемы. Проблема может быть только у компилятора, если перемудрить с with и включить в него несколько однотипных объектов. Вот еще пару примеров использования with. Это в классе, отрисовывающем нестандартное окно, в процедуре, где вычисляется клиентская область: ![]() ![]() with Rect do begin Inc(Left, Border); Inc(Top, Border + CaptionHeight); Dec(Right, Border); Dec(Bottom, Border); end; with тут пришелся как нельзя лучше. Или тоже предложите переписать с дополнительной функцией? Не вижу никакого смысла. Кстати, дополнительные функции тоже редко оправданы (а особенно в C++, где нет вложенных функций), так как плодят лишние абстракции и еще более затрудняют понимание. А первый код с with, который я показал, если бы это было в C++, лучше переписать с ? и :. А если например одному объекту задаются свойства? ![]() ![]() with TTBXSpectrumXPTheme(TBXTheme) do begin UseGradColor1:= clLime; UseGradColor2:= clGreen; HoverColor1:= clMoneyGreen; HoverColor2:= clLime; HighlightCl := clLime; BtnFaceCl := clGreen; BtnShadowCl := clMoneyGreen; BtnHighlightCl := clMoneyGreen; HighlightTextCl := clGreen; BtnTextCl := clLime; GrayTextCl := clMoneyGreen; MenuTextCl := clLime; WindowCl := clLime; WindowFrameCl := clTeal; WindowTextCl := clLime; GreenCl := clGreen; RedCl := clYellow; YellowCl := clLime; end; Предложите затайпкасченый из глобальной переменной объект вывести в отдельную переменную и писать перед каждым свойством? И мой любимый пример с with ![]() ![]() ![]() procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin with ClientToScreen(Point(X, Y)) do PopupMenu.Popup(X, Y); end; Здесь with подходит как нельзя лучше ![]() |
Сообщ.
#238
,
|
|
|
Цитата Smike @ Предложите затайпкасченый из глобальной переменной объект вывести в отдельную переменную и писать перед каждым свойством? Use the reference Добавлено Цитата Smike @ Здесь with подходит как нельзя лучше ![]() ![]() ![]() PopupMenu.Popup(ClientToScreen(Point(X,Y))); |
Сообщ.
#239
,
|
|
|
Мой переход, на Delphi, с плюсов, вызван в первую очередь, переходом на принципы и концепции "экстримального программирования", котороe приносит больше восторга, и провозглашений "бугага, я это сделал".
![]() |
![]() |
Сообщ.
#240
,
|
|
Цитата archimed7592 @ ну я вот никак не признаю... Так что "не признаю"? Об этом и речь - удобным будет только привычный инструмент. Но это никак не характеризует прочие инструменты. |