Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.30;
Скачать: CL | DM;

Вниз

оператор with   Найти похожие ветки 

 
jack128_   (2011-07-02 23:04) [40]


> Чем то принципиально отличается?

да. Сложностью реализации iterator паттерна на дельфи. Пока в дельфи не появится yield - не взлетит.


 
TUser ©   (2011-07-03 06:02) [41]


> _Юрий   (02.07.11 12:18) [29]

А это кто так умеет? (Я, каюсь, застрял на уровне Делфи 7)


 
Юрий Зотов ©   (2011-07-03 09:29) [42]

> cross   (01.07.11 16:27)

> как вы относитесь к оператору with?
У нас одностороннее знакомство: я его знаю, он меня - нет.

> стоит ли его использовать?
Дело вкуса.

> хотелось бы услышать ваше мнение.
Я использую его в простых и коротких конструкциях, где он практически не влияет на читабельность. Иногда использую двойной with, но только там, где он наверняка не дает неоднозначности. И никогда - тройной и выше.


 
_Юрий   (2011-07-03 10:08) [43]


> jack128_   (02.07.11 23:04) [40]


> да. Сложностью реализации iterator паттерна на дельфи. Пока
> в дельфи не появится yield - не взлетит.


Не вижу особых проблем, так как в 99 процентах случаев это относится к списку, а для него уже все реализовано.


> TUser ©   (03.07.11 06:02) [41]
>
>



См. GetEnumerator
Не помню, с какой версии появился, но точно достаточно давно, возможно, что есть уже в D7


 
DiamondShark ©   (2011-07-03 11:47) [44]


> jack128_   (02.07.11 23:04) [40]
> > Чем то принципиально отличается?
> да. Сложностью реализации
> iterator паттерна на дельфи. Пока в дельфи не появится yield
> - не взлетит.


В C# 1.0 yield не было, но итераторы как-то взлетали.
yield -- фигня.
Многие прогрессивные патерны не взлетят без автоматического управления памятью.


 
DiamondShark ©   (2011-07-03 11:50) [45]


> _Юрий   (02.07.11 12:18) [29]

Разумеется, не отличается. Все CLS-языки мало чем принципиально отличатся. Что и доказывает тезис о том, что дело не в with, а в совсем других языковых средствах, при наличии которых и with не особо-то и нужен.


 
DiamondShark ©   (2011-07-03 12:01) [46]


> _Юрий   (03.07.11 10:08) [43]
> Не вижу особых проблем,


class MyEnumerator : IEnumerator
{
   MyElement m_Current;
   object IEnumerator.Current
   {
     get { return m_Current; }
   }
   bool IEnumerator.MoveNext()
   {
     if (AnyExternalCondition)
       m_Current = new MyElement();
     else
       return false;
     return true;
   }
}


А теперь вопрос: кто будет заниматься генерируемыми экземплярами в исполняющей среде без автоматического управления памятью?


 
DiamondShark ©   (2011-07-03 12:04) [47]


> TUser ©   (03.07.11 06:02) [41]
> А это кто так умеет? (Я, каюсь, застрял на уровне Делфи 7)

С 2005 появилось.


 
_Юрий   (2011-07-03 13:15) [48]


> DiamondShark ©   (03.07.11 12:01) [46]
>
>



> А теперь вопрос: кто будет заниматься генерируемыми экземплярами
> в исполняющей среде без автоматического управления памятью?


Программист будет заниматься, какие варианты.
Можно поручить это итератору - запоминание предыдущего экземпляра, и его разрушение перед следущей итерацией, а последний разрушается вместе с самим итератором. Такой вариант у меня уже взлетел, просто пришлось подробно задокументировать поведение (разрушение или неразрушение идет в соответствии с переданным в конструктор итератора параметром). Слегка через задницу, но проблема решилась.
Впрочем, в большинстве случаев итерация не предполагает инстанцирования на кажлом шаге, и эта проблема не возникает вовсе.

ЗЫ, Если чего, я совершенно не отрицаю преимуществ, которые дает автоматическое управление памятью


 
DiamondShark ©   (2011-07-03 14:07) [49]


> Впрочем, в большинстве случаев итерация не предполагает

В большинстве случаев, итерация (как, впрочем, вообще любая высокоуровневая конструкция) предполагает сокрытие деталей реализации.
У вас же все потроха наружу торчат.
Документируй, не документируй, а рано или поздно встретятся непонятно откуда взявшийся инстанс, про который есть только ссылка на интерфейс-енумератор и непонятно откуда взявшийся инстанс, про который есть только ссылка на интерфейс-консумер. И опачки.
Если вы реализуете интерфейс, то вы не имеете права требовать от клиента сакрального знания, сверх спецификации интерфейса.


 
Дмитрий Тимохов   (2011-07-03 20:18) [50]

Иногда пользую. Но редко.

Лучше через однобуквенные лок. переменные.


 
Kerk ©   (2011-07-03 20:45) [51]

А почему однобуквенных-то? Символы экономишь? :)

Блин, не ветка, а сборник моих кошмаров :)


 
Inovet ©   (2011-07-03 20:54) [52]

> [51] Kerk ©   (03.07.11 20:45)
> А почему однобуквенных-то?

Остальные цифры
а1, а11, а111112
:)


 
Дмитрий Тимохов   (2011-07-03 21:11) [53]

ну я оч. редко использую - очень. на 2млн строк написанных мною за жизь - места 3 всего...


 
Игорь Шевченко ©   (2011-07-03 23:04) [54]


> на 2млн строк написанных мною за жизь


а как ты строки считаешь ?


 
_Юрий   (2011-07-03 23:13) [55]


> DiamondShark ©   (03.07.11 14:07) [49]
>
>


> В большинстве случаев, итерация (как, впрочем, вообще любая
> высокоуровневая конструкция) предполагает сокрытие деталей
> реализации.


Такая деталь, как "что же нам вернулось  - новый инстанс, или уже существующий" - вовсе не то, от чего следует абстрагироваться, неважно в каком языке. Вызывающая сторона должна четко понимать, что же она получила. По крайней мере в случаях, когда полученный экземпляр поддерживает изменение состояния.

Все прочие детали реализации сокрыты одинаково в обоих примерах.


 
Anatoly Podgoretsky ©   (2011-07-03 23:30) [56]

> Игорь Шевченко  (03.07.2011 23:04:54)  [54]

1, 2, 3,...2 000 000


 
Kerk ©   (2011-07-03 23:35) [57]


> _Юрий   (03.07.11 23:13) [55]
> Такая деталь, как "что же нам вернулось  - новый инстанс,
>  или уже существующий" - вовсе не то, от чего следует абстрагироваться,
>  неважно в каком языке. Вызывающая сторона должна четко
> понимать, что же она получила.

Принятие общего правила "я тебя породил, я тебя и убью" избавляет от подобной головной боли.


 
Eraser ©   (2011-07-03 23:57) [58]

> [54] Игорь Шевченко ©   (03.07.11 23:04)

кстати, имеется ли какая-нибудь удобная утилита для подсчета строк в pas-файлах? Понимаю, что написать можно и самому, но скорее всего ведь есть готовые средства с простенькой статистикой.


 
Anatoly Podgoretsky ©   (2011-07-04 00:25) [59]

> Eraser  (03.07.2011 23:57:58)  [58]

Посмотри у меня на сайте, в программах


 
TUser ©   (2011-07-04 10:21) [60]

cat *.pas *.dpr | wc -l

нужен цигвин или линукс


 
DiamondShark ©   (2011-07-04 10:33) [61]


> Kerk ©   (03.07.11 23:35) [57]
> Принятие общего правила "я тебя породил, я тебя и убью"
> избавляет от подобной головной боли.

Но рождает головную боль типа: "Кого считать породителем?"


interface IResourceManager
{
 Stream GetResourceStream(string resourceName);
}


Вопрос: кто "породил" стрим (а, следовательно, ответственнен за уничтожение), клиент, вызвавший GetResourceStream, или реализатор IResourceManager, который, собственно, и создал конкретный инстанс и вернул его как абстрактную ссылку клиенту?


 
Anatoly Podgoretsky ©   (2011-07-04 10:59) [62]

> DiamondShark  (04.07.2011 10:33:01)  [61]

Version Information

--------------------------------------------------------------------------------

..NET Framework
Supported in: 4, 3.5, 3.0

Ответственнен за уничтожение .NET


 
oxffff ©   (2011-07-04 12:03) [63]


> Ответственнен за уничтожение .NET


:)))))))))))))


 
Inovet ©   (2011-07-04 12:11) [64]

> [63] oxffff ©   (04.07.11 12:03)
> > Ответственнен за уничтожение .NET
>
> :)))))))))))))

Джон Конар.


 
oxffff ©   (2011-07-04 12:21) [65]


> Inovet ©   (04.07.11 12:11) [64]


:)


 
Kerk ©   (2011-07-04 13:17) [66]


> DiamondShark ©   (04.07.11 10:33) [61]
>
>
> > Kerk ©   (03.07.11 23:35) [57]
> > Принятие общего правила "я тебя породил, я тебя и убью"
> > избавляет от подобной головной боли.
>
> Но рождает головную боль типа: "Кого считать породителем?
> "
>
> interface IResourceManager
> {
>  Stream GetResourceStream(string resourceName);
> }
>


А чего тут думать-то? Надо просто правильно методы назвать.

interface IResourceManager
{
 Stream GetResourceStream(string resourceName);
 Stream CreateResourceStream(string resourceName);
}


 
Игорь Шевченко ©   (2011-07-04 14:53) [67]

Eraser ©   (03.07.11 23:57) [58]

Я wc использую


 
Anatoly Podgoretsky ©   (2011-07-04 16:06) [68]

> Игорь Шевченко  (04.07.2011 14:53:07)  [67]

оо?


 
Игорь Шевченко ©   (2011-07-04 17:08) [69]


> оо?


как в [60]


 
_Юрий   (2011-07-04 19:30) [70]


> Kerk ©   (03.07.11 23:35) [57]


> Принятие общего правила "я тебя породил, я тебя и убью"
> избавляет от подобной головной боли.
>


Это не всегда приемлимо. Например - стартуем короткую транзакцию, делаем выборку из базы, запоминаем список объектов, потом тут же закрывем транзакцию, а список оставляем себе.

В общем то, головной боли на самом деле никакой нет.

function TRepository.GetEnumerable<T>(AutoDestroyObjects: Boolean): IEnumerable<T>;

а дальше всего два варианта:

for MyModel in Repository.GetEnumerable<TMyModel>(True) do
//MyModel актуален только в течение итерации, указатель не запоминаем

for MyModel in Repository.GetEnumerable<TMyModel>(False) do
//необходимо запомнить указатель для дальнейшего разрушения

И все, никаких неоднозначностей.


 
oxffff ©   (2011-07-04 19:36) [71]


> _Юрий   (04.07.11 19:30) [70]


А в чем состоит задача?


 
_Юрий   (2011-07-04 20:53) [72]


> oxffff ©   (04.07.11 19:36) [71]
>
>


задача состоит в том, чтобы не запутаться с разрушением объектов в случае, когда итератор на каждом шаге порождает новый объект.


 
Palladin ©   (2011-07-04 22:34) [73]


> _Юрий

выборка из базы и "запоминание" объектов и есть их порождение. несогласен?


 
asail ©   (2011-07-04 23:02) [74]


> Eraser ©   (03.07.11 23:57) [58]

> кстати, имеется ли какая-нибудь удобная утилита для подсчета
> строк в pas-файлах?

CnWizards


 
_Юрий   (2011-07-04 23:26) [75]


> Palladin ©   (04.07.11 22:34) [73]


Из базы у нас возвращаются не объекты, а датасет. Порождением объектов приходится заниматься лично


 
Kerk ©   (2011-07-04 23:36) [76]


> _Юрий   (04.07.11 23:26) [75]

Ну и в чем проблема-то? Ты лично породил, ты лично и уничтожай.


 
oxffff ©   (2011-07-05 09:13) [77]


> _Юрий   (04.07.11 20:53) [72]
>
> > oxffff ©   (04.07.11 19:36) [71]
> >
> >
>
>
> задача состоит в том, чтобы не запутаться с разрушением
> объектов в случае, когда итератор на каждом шаге порождает
> новый объект.


А где путаница?

1. Например объект может предоставлять несколько енумераторов, по стратегии обхода, по стратегии принадлежности, т.е. параметр AutoDestroyObjects: Boolean не нужен.
2. Енумератор может освобождать объекты сам по окончанию своей работы.
3. Или может освобождать предыдущий объект после MoveNext на текущий.
4. GC
5. ....


 
_Юрий   (2011-07-05 20:21) [78]


> oxffff ©   (05.07.11 09:13) [77]


> А где путаница?


Я и говорю, что нет никакой путаницы. В ветке все написано, собственно.
Я просто рассказал о том, как сделал итератор, в ответ на


DiamondShark ©   (03.07.11 11:47) [44]
Многие прогрессивные патерны не взлетят без автоматического управления памятью.

Впрочем, утверждение в целом верное. Но итератор таки взлетел.



Страницы: 1 2 вся ветка

Текущий архив: 2011.10.30;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.011 c
2-1310371260
.dzmitry
2011-07-11 12:01
2011.10.30
поиск в локальной БД


15-1309505832
Andy BitOff
2011-07-01 11:37
2011.10.30
Поправка к вакансии


1-1269856808
Локара
2010-03-29 14:00
2011.10.30
Где Delphi 7 хранит инф-цию о пакетах


15-1309126862
Nic
2011-06-27 02:21
2011.10.30
ipod touch 4 - поиск по документу word


15-1309924055
Дмитрий С
2011-07-06 07:47
2011.10.30
Кто нибудь может скомпилировать это под VC9 (Visual Studio 2008)