Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];

Вниз

ООП. Как сделать правильнее ???   Найти похожие ветки 

 
Leon-Z ©   (2011-04-03 12:38) [0]

Есть два класса: TMyText и TMyPrinter.
1-ый содержить текст, 2-й умеет печатать разные тексты.

Когда создается TMyText возможно через параметр конструктора передать ссылку на TMyPrinter. Естественно, что экземпляр TMyPrinter объявляется и создается заранее. В TMyText нужно хранить ссылку на TMyPrinter и по мере надобности обращаться к этому экземпляру.
constructor TMyText.Create(aPrn: TMyPrinter);

Есть другой вариант: В конструкторе не передавать ссылку на TMyPrinter, а использовать непосредственно в методе TMyText, т.е
так: procedure TMyText.Print(Prn: TMyPrinter);
Экземпляр TMyPrinter также должен быть объявлен и создан заранее.

Какой вариант предпочтительнее с Вашей точки зрения ?


 
clickmaker ©   (2011-04-03 12:43) [1]

принципиальной разницы нет. Просто 1-й намекает на то, что текст сам по себе, без печати, как бы не имеет смысла


 
Юрий Зотов ©   (2011-04-03 14:08) [2]

Особой разницы нет, но если TMyPrinter может обзавестись потомками, то я бы сделал примерно так:

type
 TMyPrinter = class(...)
   ...
 public
   constructor Create(...); virtual;
 end;

 TMyPrinterClass = class of TMyPrinter ;

 TMyText = class(...)
 private
   FPrinterClass: TMyPrinterClass;  
 ...
 public
   constructor Create(PrinterClass: TMyPrinterClass; ...);
   procedure Print(...);
 end;
...

constructor TMyText.Create(PrinterClass: TMyPrinterClass; ...);
begin
 inherited Create(...);
 FPrinterClass := PrinterClass;
 ...
end;

procedure TMyText.Print(...);
var
 Prn: TMyPrinter;
begin
 Prn := FPrinterClass.Create(...);
 try
   ... // Печать
 finally
   Prn.Free;
 end;
end;

Удобно еще и тем, что не надо заботиться о создании и уничтожении экземпляра принтера - все делается автоматически. Ну и плюс небольшая экономия памяти, поскольку экземпляр принтера не висит в ней постоянно, а создается и уничтожается "на ходу". Конечно, это приводит к небольшому замедлению в методе Print, но есть основания полагать, что по сравнению с самой печатью такое замедление будет пренебрежимо мало.


 
Palladin ©   (2011-04-03 14:20) [3]


> Юрий Зотов ©   (03.04.11 14:08) [2]

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


 
Leon-Z ©   (2011-04-03 14:30) [4]


> Юрий Зотов ©   (03.04.11 14:08) [2]

Мастер-класс !!!


 
Leon-Z ©   (2011-04-03 14:31) [5]


> Юрий Зотов ©   (03.04.11 14:08) [2]

Мастер-класс !!!


 
Leon-Z ©   (2011-04-03 14:40) [6]

А согласно каким критериям определить вид отношения.
Можно так:

 TMyText.Print(Prn: TMyPrinter);

А ведь можно и так:

 TMyPrinter.Print(Txt: TMyText);


Какой вариант выбрать ???


 
clickmaker ©   (2011-04-03 14:54) [7]

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


 
Юрий Зотов ©   (2011-04-03 15:13) [8]

> Leon-Z ©   (03.04.11 14:40) [6]

> TMyText.Print(Prn: TMyPrinter);

Это согласуется с принципами ООП - каждый объект знает, как ему самого себя обрабатывать. Ведь может быть несколько потомков TMyText и у каждого свои особенности и свой собственный метод Print.

> TMyPrinter.Print(Txt: TMyText);

А это согласуется с нормальной человеческой логикой - ведь мы привыкли, что печатает все же принтер, а не текст.


 
Юрий Зотов ©   (2011-04-03 15:37) [9]

> Leon-Z ©   (03.04.11 14:40) [6]

Кстати, стоит подумать - если текст будет печатать сам себя, то нужен ли вообще класс принтера? Что тогда остается на его долю?


 
Jeer ©   (2011-04-03 17:34) [10]


> то нужен ли вообще класс принтера? Что тогда остается на
> его долю?


Точно. Я бы включил методы работы с текстом в класс Текст.


 
Leon-Z ©   (2011-04-03 19:20) [11]


> Юрий Зотов ©   (03.04.11 15:13) [8]

Значит правильнее выбрать 1-й вариант ???

> Юрий Зотов ©   (03.04.11 15:37) [9]
> > Leon-Z ©   (03.04.11 14:40) [6] Кстати, стоит подумать
> - если текст будет печатать сам себя, то нужен ли вообще
> класс принтера? Что тогда остается на его долю?

Класс принтера нужен. Он содержит ф-ии выбора шрифта, цвета, печати строки и рисунка и т.п. (Это некий виртуальный принтер).


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

procedure TMyText.Print(Prn: TMyPrinter);
begin
 Prn.Print(Self);
end;

Или наоборот. Где реализовать - надо смотреть по структуре классов, как удобней


 
_Юрий   (2011-04-04 18:32) [13]

Не кажется ли уважаемым Мастерам, что хардкорно связывать текст с принтером(или принтер с текстом) - это путь к так называемому "спагетти-коду"?
Ioc нынче не в почете?


 
Ega23 ©   (2011-04-05 20:51) [14]

IMyPrinter = interface
 [GUID]
 procedure Print(const SomeText: string);
end;

TMyText = class (...)
 procedure Print(Printer: IMyPrinter);
end;

TMyPrinter = class (TInterfacedObject, IMyPrinter)
 procedure Print(const SomeText: string);
end;

procedure TMyText.Print(Printer: IMyPrinter);
begin
 Printer.Print("Bla-Bla-Bla");
end;


И не важно, что из себя представляет класс принтера и вообще какого он класса.

Ы?



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

Форум: "Начинающим";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-1260213430
Leto
2009-12-07 22:17
2011.07.17
Странно работает thintwindow


2-1302357979
takki
2011-04-09 18:06
2011.07.17
TDrawGrid


15-1301603395
Юрий
2011-04-01 00:29
2011.07.17
С днем рождения ! 1 апреля 2011 пятница


1-1259428639
VMan80
2009-11-28 20:17
2011.07.17
Поиск в TreeView


15-1301597976
Медвежонок Пятачок
2011-03-31 22:59
2011.07.17
кажется началось





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский