
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Страницы: (117) « Первая ... 15 16 [17] 18 19 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#241
,
|
|
|
Цитата Пишущему на паскале сипипи всегда будет китайской грамотой, равно как и наоборот Не надо вот так необдуманно кванторы всеобщности применять. Паскаль учила после с++, в универе. Китайской грамотой не показался ни разу --- просто слабым по возможностям языком.(преподавали стандарт паскаля).Понять тот же with было несложно, просто непонятно особо было на кой он нужен. Зашла сейчас в пару тем в дельфях -- вроде в коде все понятно.Некрасиво, на мой вкус, но понятно. |
Сообщ.
#242
,
|
|
|
Цитата archimed7592 @ ну я вот никак не признаю... я очень хорошо знал паскаль... сипипи считал китайской грамотой, но делал попытки понять его... понять удалось, стал опаскаль китайской грамотой считать... Похоже ты просто Дельфи, как говорится, не осилил ![]() На мой взгляд, у каждого языка есть достоинства и недостатки. Мне, например, очень не хватает сишных ?:, декларации переменных в любом месте кода (даже в Борландовском опросе просил о такой фиче ![]() Но с другой стороны я терпеть не могу сишный case, где нужно в каждом варианте писать return/break, декларации интерфейсов, от которых пухнет голова (а ActiveX без интерфейсов — не ActiveX), отсутствие вложенных функций. Но тем не менее отсутствие тех или иных возможностей или наличие неудобств в каждом из языков не мешают писать на нем качественные и полезные программы! Поэтому если спорить, то лучше не об ущербности того или иного языка, потому что это объективно не так в обоих случаях, а о достоинствах или недостатках, которые есть везде. Добавлено Не пройдет ![]() УмнО. With и так использует ссылку на класс ![]() Добавлено Цитата Smike @ Не пройдет ![]() И это правильно, потому что обилие скобок тоже не к добру. А это вообще жесть. Чувствительным сишникам не смотреть ![]() ![]() ![]() procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with ScreenToClient(Panel1.ClientToScreen(Point(X, Y))) do Caption := Format('x: %d, y: %d', [X, Y]); end; |
Сообщ.
#243
,
|
|
|
Цитата Smike @ Hryak почему-то упирает на проблему с распознаванием методов класса и обычных процедур внутри блока with. Я же в упор не вижу здесь проблемы. Ну, и Бог с тобой, не видь. Цитата Вот еще пару примеров использования with. Это в классе, отрисовывающем нестандартное окно, в процедуре, где вычисляется клиентская область: ![]() ![]() with Rect do begin Inc(Left, Border); Inc(Top, Border + CaptionHeight); Dec(Right, Border); Dec(Bottom, Border); end; with тут пришелся как нельзя лучше. Или тоже предложите переписать с дополнительной функцией? Не вижу никакого смысла. Скока буковок... ![]() ![]() rect += Rect(border, border + captionHeight, -border, -border); Цитата Кстати, дополнительные функции тоже редко оправданы (а особенно в C++, где нет вложенных функций), так как плодят лишние абстракции и еще более затрудняют понимание. А первый код с with, который я показал, если бы это было в C++, лучше переписать с ? и :. Ну вот так, и даже со столь любимыми вложенными функциями - вернее, эмуляцией этого (сам так не пишу, считаю достаточным написать в анонимном неймспейсе функцию) Вместо Цитата пишем![]() ![]() 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; ![]() ![]() struct In { void SpecPow(double& x, double y) { x = x > 0. ? pow(x, y) : 0.; } }; In::SpecPow(rgb.R, gamma); In::SpecPow(rgb.G, gamma); In::SpecPow(rgb.B, gamma); Цитата А это вообще жесть. Чувствительным сишникам не смотреть ![]() ![]() procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with ScreenToClient(Panel1.ClientToScreen(Point(X, Y))) do Caption := Format('x: %d, y: %d', [X, Y]); end; Действительно, чего тут смотреть? ![]() ![]() const Point& pt = ScreenToClient(Panel1.ClientToScreen(Point(X, Y))); caption = Format("x: %d, y: %d", pt.X, pt.Y); |
Сообщ.
#244
,
|
|
|
Цитата Hryak @ rect += Rect(border, border + captionHeight, -border, -border); Красиво, но добавляет лишнюю операцию и трубует, чтобы оператор сложения был перегружен. Цитата Hryak @ Ну вот так, и даже со столь любимыми вложенными функциями - вернее, эмуляцией этого (сам так не пишу, считаю достаточным написать в анонимном неймспейсе функцию) Лишний вызов функции. Лучше уж в анонимном неймспейсе инлайн-функцию добавить ![]() Цитата Hryak @ Действительно, чего тут смотреть? Лишняя переменная... ну да ладно, с сишной декларацией переменных это не столь неудобно ![]() По поводу же одного моего примера ты умолчал. Значит согласен с целессобразностью применения with? |
Сообщ.
#245
,
|
|
|
Smike, а что по поводу моего поста с делегатами?
Добавлено Вот этого вот: Delphi vs C++ (сообщение #1519380) |
![]() |
Сообщ.
#246
,
|
|
Цитата Pourtous @ Не надо вот так необдуманно кванторы всеобщности применять. <...> Понять тот же with было несложно, просто непонятно особо было на кой он нужен. Зашла сейчас в пару тем в дельфях -- вроде в коде все понятно.Некрасиво, на мой вкус, но понятно. Исключительно обдуманно ![]() |
Сообщ.
#247
,
|
|
|
Цитата Smike @ Красиво, но добавляет лишнюю операцию При использовании нормального компилятора машинный код будет практически одинаков с твоим вариантом. Цитата Лишний вызов функции. Размещение тела метода прямо в определении класса - автоматом подразумевает inline. Цитата Лучше уж в анонимном неймспейсе инлайн-функцию добавить ![]() Если тело функции, где дело происходит, не с километр - то не сильно как и пострадает.. Цитата Лишняя переменная... ну да ладно, с сишной декларацией переменных это не столь неудобно ![]() Ну, я не стремлюсь минимизировать использование переменных - зачастую сложные выражения дроблю на мелкие для лучшего восприятия. Так что не напрягаюсь и в этом случае.. Цитата По поводу же одного моего примера ты умолчал. Значит согласен с целессобразностью применения with? Это где много-много строчек инициализации свойств у объекта? Дык, уже же сказали: "Use the reference, Smike" © |
Сообщ.
#248
,
|
|
|
Цитата Smike @ Лишняя переменная... ну да ладно, с сишной декларацией переменных это не столь неудобно ![]() это ссылка вообще-то |
Сообщ.
#249
,
|
|
|
Отдельные Delphi'сты скатились до аргументации "Да что вы понимаете в конной авиации?". Забавно.
|
Сообщ.
#250
,
|
|
|
Цитата Hryak @ Ага, не скакать дак комментарии писать. ![]() А что, самодокументируемый код уже заменяет комментарии? Ну, ладно, раз так. Комментарий нужен всего один, рядом с with, а вот писать каждый раз имя объекта, которое может быть жуть каким длинным, это и правда неприятно. В общем-то именно для сокращения времени набора with, наверное, и был сделан, не более того. О чем и говорил, если подозреваешь с ним проблем - не юзай, и все тут. Главный-то цимес в том, что он есть, а пользовать или нет на усмотрение прогера ![]() |
Сообщ.
#251
,
|
|
|
Цитата Астарот @ А что, самодокументируемый код уже заменяет комментарии? Ну, ладно, раз так. ![]() Цитата Комментарий нужен всего один, рядом с with И какой будет текст у комментария? Цитата а вот писать каждый раз имя объекта, которое может быть жуть каким длинным, это и правда неприятно. Для сколь угодно длинного имени можно ссылкой ввести короткий псевдоним. |
Сообщ.
#252
,
|
|
|
У каждого unit'а свое пространство имен и если два модуля содержат сущности с одинаковыми названиями, можно явно сослаться на сущность. Чуть-чуть похоже на import в Java. |
Сообщ.
#253
,
|
|
|
Цитата Hryak @ ![]() Не удивительно, чт ты путаешься ![]() Цитата Hryak @ И какой будет текст у комментария? Ты меня спросил? Это ж у тебя проблемы с различением двух сущностей возникают, а не у меня, так что и комментарий на свой вкус напиши. Ну, например, такой - "Если прога глючит, то попробовать убрать тут with" ![]() Цитата Hryak @ Для сколь угодно длинного имени можно ссылкой ввести короткий псевдоним. В дельфи такой подход не прокатит из-за того, что переменные определяются в строго определенном месте, так что толку будет ноль. Или я снова тебя не понял, что вполне возможно, си уже лет пять не занимаюсь. |
Сообщ.
#254
,
|
|
|
Цитата Астарот @ Не удивительно, чт ты путаешься ![]() Я не путаюсь, потому что with не использую и проблем не возникает. Зачем писать комментарий к коду, если и так всё понятно? Цитата Цитата Hryak @ Для сколь угодно длинного имени можно ссылкой ввести короткий псевдоним. В дельфи такой подход не прокатит из-за того, что переменные определяются в строго определенном месте, так что толку будет ноль. Я и не предлагаю из Делфей убрать with - там этот костыль нужен, раз нельзя объявлять переменные в месте их использования и уменьшать область их видимости настолько, насколько нужно. Я про то, что with в Делфи не является преимуществом перед С++, в котором with нету и не нужен он там. |
Сообщ.
#255
,
|
|
|
Цитата Hryak @ Ты не понял. Пишешь wc. и получаешь список только имен из WINDOWCLASS. А если через with делать, то получишь список из всех идентификаторов, видимых в данном месте. Ну, что с Delphi взять-то? ![]() ![]() ![]() with (wndclassex) { .cbSize = sizeof wndclassex; .style = CS_DBLCLKS; /* ... */ } Все перечисленные тобой проблемы отпадают. Длина в 5 - 6 символов - вполне нормальное имя для локальной области видимости (кто-то там говорил про самодокументируемый код?). Однако при множественном обращении к членам теряется и удобство написания, и читаемость по сравнению с возможным решением с помощью with. Не надо передёргивать. И, кстати, вместо идентификатора может быть выражение. Предвижу, что вы тут же скажете про ссылки. Однако ж auto объявления в C++ пока нет, так что тип ссылки придётся указывать явно, а это уже минус, особенно если наименование типа длинное (вспоминаем про итераторы). И вообще, чем меньше имён, тем лучше. В течение конструирования объект не считается существующим. Или ты опять хотел сказать что-то другое? ![]() Неправда. Структура, унаследованная от какого-либо класса, не является POD типом, но её объекты могут быть членами non-POD объединения. Цитата Smike @ Но с другой стороны я терпеть не могу сишный case В C++ case не особо-то и нужен, ибо обычно есть альтернативы получше: полиморфизм или ассоциативные массивы. Цитата Smike @ отсутствие вложенных функций. Можно использовать вложенные классы ![]() ![]() int main() { struct A { static int func() { /* ... */ } }; } Менее удобно, но всё же. |