![]() |
Модераторы: THandle, bems |
![]() ![]() ![]() |
|
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 2 Всего: 88 |
k0rvin, нет with нужно переделать подругому
Порядок классов обрабатывается как в except -------------------- Обижено школьников: 8 |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
Может быть я не в тему(хотя тут все посты оффтоп), а кто нибудь сталкивался в живую с неправильно работающим "with" ?
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
Смотря что вы понимаете под "неправильным". -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
k0rvin |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 0 Всего: 5 |
имхо, Вы усложняете -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
||||
|
|||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 2 Всего: 88 |
Это было бы усложнением если бы я пытался так решить проблему о которой говорил CodeМonkey. А я тут двух зайцев.
Согласись, бывают же случаи (и не то что бы редко), когда приходится писать так
Мой вариант как раз для вот таких случаев, но добавляет сервис компилятора: в then-ветке объект имеет тот тип, который только что был успешно протестирован. Это безопаснее, потому что не требует приведения типа. И пример не совсем мой, нечто подобное кажется есть в Обероне. -------------------- Обижено школьников: 8 |
|||
|
||||
k0rvin |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 0 Всего: 5 |
ясно... сегодня я вдруг подумал, а ведь у uses такое же поведение, как и у with, т.е. например
выведет в stdin "Unit1.Foo", но стоит добавить декларацию Foo в интерфейсную часть Unit2, как мы получаем тот же эффект, что и с with. -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
||||||
|
|||||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
обсуждение надуманной проблемы, ни разу не испытывал каких то проблем при использовании with, как и при поиске методов в модулей. Если и возникает ошибочное обращение, то это легко отлавливается.
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 2 Всего: 88 |
Ты наверное хотел сказать stdout Ну да, этот эффект от порядка юнитов известен и даже используется (для тспользования базового компонента в дизайнтайме и подмены его кастомным наследником в рантайме) -------------------- Обижено школьников: 8 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
Это не надуманная проблема. Часто ли вы используете with и модифицируете классы, участвующие в нём? Если бы вы делали это достаточно часто, то уже набили бы себе несколько шишек. И ловится это не так просто, как вам кажется - потом будете долго плеваться. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
||||
|
||||
k0rvin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 0 Всего: 5 |
да, хотел... но перепутал =) а зачем "использовать базовый компонент в дизайнтайме и подменять его кастомным наследником в рантайме"? и, ты наверное хотел сказать в compile-time'е, а не рантайме? =) -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
Что-то мне подсказывает, что все они - однотиповые использования статических классов VCL ;) Если у вас есть динамически развивающаяся иерархия классов и вы так часто используете with - лично мне странно, что вы с этим не сталкивались. Когда-то я тоже довольно часто использовал with. И для меня выглядели странными высказывания некоторых людей, которые говорили об опасности использования with и о том, что они теперь его используют очень редко или не используют вообще (кажется, это был DRON на DK). Я тоже думал: "ну, с мной же такого не может произойти, ведь я внимательно слежу за своим кодом!". Поэтому я выкинул это из головы и продолжил жить дальше. Пока, в один прекрасный день программа не стала себя странно вести. Нет, она не вылетала, не выкидывала исключение - она просто вела себя "как-то не так". Я потратил чуть ли не день, закопавшись в отладчик, пытаясь понять как же это "не так". В итоге я выяснил, что нужный метод не вызывается вовсе - бряк, поставленный на него не срабатывает. Мои глаза чуть не вылезли, когда я увидел, что код вызова этого метода вообще-то выполняется. Да, про то обсуждение with я уже забыл, и даже не обратил внимание, что он здесь используется - блок кода был большим. Поэтому я закопался в ассемблерный отладчик только для того, чтобы увидеть, что вызывается метод не того объекта. После чего я увидел with и долго стучал головой о стол. Когда такое произошло во второй раз (окей, в этот раз я потратил меньше времени), я вспомнил о том обсуждении with на DK и сказал себе: всё, стоп, хватит с меня этого. Не пойти ли этому with в баню. С того момента я не использую with. Каждый раз, когда у меня длинная переменная или цепочка (кандидаты для использования with) - я завожу переменную-псевдоним. Всё, точка. Теперь у меня нет и не может быть таких проблем. Кроме того, в новых Delphi завести псевдоним даже проще, чем написать with - благо есть рефакторинг "Introduce variable". Ладно, может быть такие временные отказы и не слишком серьёзная причина, но, как я уже сказал, настоящая проблема не столько в них, сколько в том, что вы не можете это контролировать. Вы можете изменить какой-то класс и даже не заметить как поплыла ваша программа. Вы сдаёте программу заказчику, а через два месяца он вам звонит и говорит: "а какого чёрта не работает функционал X, если мы его проверяли в январе?". И когда вы начнёте копаться в этом, вы обнаружите, что with стал вызывать другой метод, из-за чего нарушилась вся логика уже отлаженного кода, который вы полгода уже не трогали. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
CodeMonkey
На счет динамичности, то тут все я бы сказал через чур динамично и не детерменированно, но все таки больших проблем именно из-за with не имел. Ну на самом деле With мне никогда не нравился, правда в других аспектах: затруднение отладки и разбор чужого кода. Может действительно, стоит не ждать удара граблей по лбу и взять на вооружение практику "никакого with, псевдоним наше все". Это сообщение отредактировал(а) cemick - 22.3.2010, 11:44 |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 2 Всего: 88 |
k0rvin, я хотел сказать то что сказал.
Добавлено через 6 минут и 19 секунд
Если нужен именно наследник, и ты хочешь полноценную работу с дизайнером. Тут можно зарегистрировать наследник и ложить на форму его, но это не всегда удобно, многие любят чтобы проект собирался без манипуляций со средой вроде установки компонент. -------------------- Обижено школьников: 8 |
|||
|
||||
k0rvin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 0 Всего: 5 |
зачем менять класс в рантайме, если лучше и правильней в случае делфи/паскаля это сделать при компиляции. вообще хотелось бы посмотреть как Вы будете менять класс объекта в рантайме в делфи =) -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi" | |
|
Добро пожаловать в форум группы "Delphi". В разделе разрешается:
Строго запрещено:
Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Форум группы: delphi | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |