Модераторы: THandle, bems

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна идея, Нужно сделать и быстро но нет идеи 
:(
    Опции темы
bems
Дата 17.3.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



k0rvin, нет with нужно переделать подругому
Код

with Obj do
 Alias1 as TClass1 do {Тут Alias1 имеет значение Obj и класс TClass1};
 Alias2 as TClass2 do {Тут Alias2 имеет значение Obj и класс TClass2};
 else // ветка, соответствующая текущему with 
 end;

Порядок классов обрабатывается как в except


--------------------
Обижено школьников: 8
PM MAIL   Вверх
cemick
Дата 17.3.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Может быть я не в тему(хотя тут все посты оффтоп), а кто нибудь сталкивался в живую с неправильно работающим "with"  ? 
PM MAIL WWW   Вверх
CodeMonkey
Дата 17.3.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 4
Всего: 89



Цитата(cemick @  17.3.2010,  15:09 Найти цитируемый пост)
а кто нибудь сталкивался в живую с неправильно работающим "with"  ?

Смотря что вы понимаете под "неправильным".


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
k0rvin
Дата 17.3.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 0
Всего: 5



Цитата(bems @ 17.3.2010,  14:50)
k0rvin, нет with нужно переделать подругому
Код

with Obj do
 Alias1 as TClass1 do {Тут Alias1 имеет значение Obj и класс TClass1};
 Alias2 as TClass2 do {Тут Alias2 имеет значение Obj и класс TClass2};
 else // ветка, соответствующая текущему with 
 end;

Порядок классов обрабатывается как в except

имхо, Вы усложняете


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
bems
Дата 18.3.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



Цитата(k0rvin @  17.3.2010,  18:30 Найти цитируемый пост)
имхо, Вы усложняете 
Это было бы усложнением если бы я пытался так решить проблему о которой говорил CodeМonkey. А я тут двух зайцев.
Согласись, бывают же случаи (и не то что бы редко), когда приходится писать так
Код

if Obj is TClass1
   then //use TClass1(Obj)
   else if Obj is TClass2
           then //use TClass2(Obj)

Мой вариант как раз для вот таких случаев, но добавляет сервис компилятора: в then-ветке объект имеет тот тип, который только что был успешно протестирован. Это безопаснее, потому что не требует приведения типа. И пример не совсем мой, нечто подобное кажется есть в Обероне.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
k0rvin
Дата 18.3.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 0
Всего: 5



ясно... сегодня я вдруг подумал, а ведь у uses такое же поведение, как и у with, т.е. например

Код

program test;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit1 in 'Unit1.pas',
  Unit2 in 'Unit2.pas';

begin
  Foo;
  ReadLn;
end.


Код

unit Unit1;

interface

procedure Foo;

implementation

procedure Foo;
begin
  WriteLn( 'Unit1.Foo' );
end;

end.


Код

unit Unit2;

interface

implementation

procedure Foo;
begin
  WriteLn( 'Unit2.Foo' );
end;

end.


выведет в stdin "Unit1.Foo", но стоит добавить декларацию Foo в интерфейсную часть Unit2, как мы получаем тот же эффект, что и с with.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
cemick
Дата 18.3.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



обсуждение надуманной проблемы, ни разу не испытывал каких то проблем при использовании with, как и при поиске методов в модулей. Если и возникает ошибочное обращение, то это легко отлавливается. 
PM MAIL WWW   Вверх
bems
Дата 19.3.2010, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



Цитата(k0rvin @  18.3.2010,  18:20 Найти цитируемый пост)
выведет в stdin "Unit1.Foo", но стоит добавить декларацию Foo в интерфейсную часть Unit2, как мы получаем тот же эффект, что и с with. 

Ты наверное хотел сказать stdout
Ну да, этот эффект от порядка юнитов известен и даже используется (для тспользования базового компонента в дизайнтайме и подмены его кастомным наследником в рантайме)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 19.3.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 4
Всего: 89



Цитата(cemick @  18.3.2010,  19:09 Найти цитируемый пост)
ни разу не испытывал каких то проблем при использовании with

Это не надуманная проблема. Часто ли вы используете with и модифицируете классы, участвующие в нём? Если бы вы делали это достаточно часто, то уже набили бы себе несколько шишек. И ловится это не так просто, как вам кажется - потом будете долго плеваться.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cemick
Дата 19.3.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Цитата(CodeMonkey @  19.3.2010,  12:42 Найти цитируемый пост)
асто ли вы используете with и модифицируете классы

Сделал поиск по рабочему проекту слова "with" (whole word only) 2793 matches.
PM MAIL WWW   Вверх
k0rvin
Дата 19.3.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 0
Всего: 5



Цитата(bems @ 19.3.2010,  07:56)
Цитата(k0rvin @  18.3.2010,  18:20 Найти цитируемый пост)
выведет в stdin "Unit1.Foo", но стоит добавить декларацию Foo в интерфейсную часть Unit2, как мы получаем тот же эффект, что и с with. 

Ты наверное хотел сказать stdout
Ну да, этот эффект от порядка юнитов известен и даже используется (для тспользования базового компонента в дизайнтайме и подмены его кастомным наследником в рантайме)

да, хотел... но перепутал =)

а зачем "использовать базовый компонент в дизайнтайме и подменять его кастомным наследником в рантайме"?

и, ты наверное хотел сказать в compile-time'е, а не рантайме? =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
CodeMonkey
Дата 22.3.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 4
Всего: 89



Цитата(cemick @  19.3.2010,  12:59 Найти цитируемый пост)
2793 matches

Что-то мне подсказывает, что все они - однотиповые использования статических классов VCL ;) Если у вас есть динамически развивающаяся иерархия классов и вы так часто используете with - лично мне странно, что вы с этим не сталкивались.

Когда-то я тоже довольно часто использовал with. И для меня выглядели странными высказывания некоторых людей, которые говорили об опасности использования with и о том, что они теперь его используют очень редко или не используют вообще (кажется, это был DRON на DK). Я тоже думал: "ну, с мной же такого не может произойти, ведь я внимательно слежу за своим кодом!". Поэтому я выкинул это из головы и продолжил жить дальше.

Пока, в один прекрасный день программа не стала себя странно вести. Нет, она не вылетала, не выкидывала исключение - она просто вела себя "как-то не так". Я потратил чуть ли не день, закопавшись в отладчик, пытаясь понять как же это "не так". В итоге я выяснил, что нужный метод не вызывается вовсе - бряк, поставленный на него не срабатывает. Мои глаза чуть не вылезли, когда я увидел, что код вызова этого метода вообще-то выполняется. Да, про то обсуждение with я уже забыл, и даже не обратил внимание, что он здесь используется - блок кода был большим. Поэтому я закопался в ассемблерный отладчик только для того, чтобы увидеть, что вызывается метод не того объекта. После чего я увидел with и долго стучал головой о стол.

Когда такое произошло во второй раз (окей, в этот раз я потратил меньше времени), я вспомнил о том обсуждении with на DK и сказал себе: всё, стоп, хватит с меня этого. Не пойти ли этому with в баню. С того момента я не использую with. Каждый раз, когда у меня длинная переменная или цепочка (кандидаты для использования with) - я завожу переменную-псевдоним. Всё, точка. Теперь у меня нет и не может быть таких проблем. Кроме того, в новых Delphi завести псевдоним даже проще, чем написать with - благо есть рефакторинг "Introduce variable".

Ладно, может быть такие временные отказы и не слишком серьёзная причина, но, как я уже сказал, настоящая проблема не столько в них, сколько в том, что вы не можете это контролировать. Вы можете изменить какой-то класс и даже не заметить как поплыла ваша программа. Вы сдаёте программу заказчику, а через два месяца он вам звонит и говорит: "а какого чёрта не работает функционал X, если мы его проверяли в январе?". И когда вы начнёте копаться в этом, вы обнаружите, что with стал вызывать другой метод, из-за чего нарушилась вся логика уже отлаженного кода, который вы полгода уже не трогали.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cemick
Дата 22.3.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



CodeMonkey
На счет динамичности,  то тут все я бы сказал через чур динамично и не детерменированно, но все таки больших проблем именно из-за with не имел.
Ну на самом деле With мне никогда не нравился, правда в других аспектах: затруднение отладки и разбор чужого кода. Может действительно, стоит не ждать удара граблей по лбу и взять на вооружение практику "никакого with, псевдоним наше все". 


Это сообщение отредактировал(а) cemick - 22.3.2010, 11:44
PM MAIL WWW   Вверх
bems
Дата 22.3.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



k0rvin, я хотел сказать то что сказал.

Добавлено через 6 минут и 19 секунд
Цитата(k0rvin @  19.3.2010,  19:50 Найти цитируемый пост)
а зачем "использовать базовый компонент в дизайнтайме и подменять его кастомным наследником в рантайме"?

Если нужен именно наследник, и ты хочешь полноценную работу с дизайнером. Тут можно зарегистрировать наследник и ложить на форму его, но это не всегда удобно, многие любят чтобы проект собирался без манипуляций со средой вроде установки компонент.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
k0rvin
Дата 24.3.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 0
Всего: 5



Цитата(bems @ 22.3.2010,  15:05)
k0rvin, я хотел сказать то что сказал.

зачем менять класс в рантайме, если лучше и правильней в случае делфи/паскаля это сделать при компиляции.

вообще хотелось бы посмотреть как Вы будете менять класс объекта в рантайме в делфи =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle

Добро пожаловать в форум группы "Delphi".

В разделе разрешается:

  • Флудить (в приемлемых величинах)
  • Обсуждать модерирование данного раздела (но не его модератора)
  • Добавлять свои правила если они не противоречат существующим
  • Делать наезды на пешеходов***

Строго запрещено:

  • Размещать рекламу
  • Совершать оскорбления личностей
  • Материться
  • *** Пешеходами не являются (ко)модераторы, админы, участники клуба.

Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Форум группы: delphi | Следующая тема »


 




[ Время генерации скрипта: 0.1651 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.