Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> если метод класса довольно объемный, описать в другом модуле? 
V
    Опции темы
Teleport
Дата 21.8.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот, например, есть у моей формы метод:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
   procedure My_Text_method;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Как метод Form1
procedure TForm1.My_Text_method;
begin
  Label1.Caption:= 'Мой текст1 метод';
  //много разных операций;
 // еще много разных операций
  Label2.Caption:= 'Мой текст2 метод';
end;
  
end.


И Этот метод, допустим, не 5 строчек, а несколько сотен. Таких методов несколько. Если их все оставить в Unit1 - как-то глаза разбегаются, да и метод уже не изменяется, а другие методы меняются - неудобно держать все в одном Unit1. Возникла мысль - поместить его в другой Unit. Например, Unit2. Но как метод класса описать в другом Unit? Или я ерунду придумал?

Это сообщение отредактировал(а) Teleport - 21.8.2009, 10:36


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Frees
Дата 21.8.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Цитата(Teleport @  21.8.2009,  13:36 Найти цитируемый пост)
Или я ерунду придумал?

помоему ерунду
Цитата(Teleport @  21.8.2009,  13:36 Найти цитируемый пост)
Но как метод класса описать в другом Unit?

если он те мешается напиши в другом юните функцию и вызывай ее в методе
получется что ты перенесеш код в другой юнит но сути это не изменит


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
kami
Дата 21.8.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Teleport @  21.8.2009,  10:36 Найти цитируемый пост)
да и метод уже не изменяется, а другие методы меняются

Убери его в конец модуля, будет меньше глаза мозолить.
В другой модуль убирать может быть нецелесообразно, особенно если метод использует приватные поля класса.
PM MAIL WWW   Вверх
bems
Дата 22.8.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а) переписать чтобы было несколько(много) методов покороче (рекомендуется)
б) вынести его в inc-файл, а в модуле написать {$I BigMethod.inc}
в) использовать {$REGION}...{$ENDREGION} (хотя поскольку это один метод, фолдинг и так никто не отменял)


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


Эксперт
****


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

Репутация: 9
Всего: 58



В последних версиях среды есть возможность сворачивания кода, тоже вариант если глаза мозолит.


--------------------
PM MAIL WWW   Вверх
NewDima
Дата 22.8.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата

Или я ерунду придумал?

Абсолютно, если методы разрослись и их еще и много, то:
1. приватный доступ для того и сделали, чтобы публичные методы не разростались;
2. очевидно на один класс возложено более одной задачи, значит ошибка в проектировании,
используй рефакторинг для разбиения на класса на несколько других (это позволит тебе проще отлавливать ошибки и править код)
Цитата

если он те мешается напиши в другом юните функцию и вызывай ее в методе
получется что ты перенесеш код в другой юнит но сути это не изменит

Frees, ты сейчас убил весь принцип ООП
Соглашусь с bems тольо по первому пункту, так как остальные не убирают проблему, а маскируют ее
PM ICQ   Вверх
mongoloid
Дата 23.8.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(NewDima @ 22.8.2009,  17:55)
Цитата

Или я ерунду придумал?

Абсолютно, если методы разрослись и их еще и много, то:
1. приватный доступ для того и сделали, чтобы публичные методы не разростались;
2. очевидно на один класс возложено более одной задачи, значит ошибка в проектировании,
используй рефакторинг для разбиения на класса на несколько других (это позволит тебе проще отлавливать ошибки и править код)
Цитата

если он те мешается напиши в другом юните функцию и вызывай ее в методе
получется что ты перенесеш код в другой юнит но сути это не изменит

Frees, ты сейчас убил весь принцип ООП
Соглашусь с bems тольо по первому пункту, так как остальные не убирают проблему, а маскируют ее

 Не, "приватность" нужна не для того, чтобы "...чтобы публичные методы не разростались;". Зачем новичка вводить в заблуждение?.. Приватность нужна, среди прочего, для сокрытия реализации, для того, чтобы не сообщать пользователю класса лишней, не нужной ему информации. Ну и т.д... См. основы ООП.
И никак не могу согласиться с тем, что вынос функций (не методов!) в отдельный юнит "убивает ООП". Крайне спорное утверждение. А вот вынос метода в другой юнит...  В Дельфи вы это и не сделаете. Если только реализацию метода не делегируете другому классу (о реализации интерфейса я вообще молчу в данном контексте), но это уже немного другое. 
 И по существу вопроса для Teleport:
 1. Юниты бывают большие, от этого никуда не деться, даже при самом грамотном проектировании. Самый лучший наглядный пример, который всегда под рукой: исходники Дельфи, которые вы можете посмотреть сами.
 2. Существует такое "неформальное правило": тело функции (метода, процедуры) должно помещаться на экране, т.е. оно должно быть "обозримым". Если не помещается, то функцию стараются разбить на несколько небольших.
 3. Метод класса в другом юните не опишешь. Можно реализацию метода разбить на "чистые" (pure) функции, и эти функции вынести в другой юнит. Но, сдается мне, пока вам рановато думать об этом.


Это сообщение отредактировал(а) mongoloid - 23.8.2009, 12:07
PM MAIL   Вверх
NewDima
Дата 23.8.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата

 Не, "приватность" нужна не для того, чтобы "...чтобы публичные методы не разростались;". Зачем новичка вводить в заблуждение?.. Приватность нужна, среди прочего, для сокрытия реализации, для того, чтобы не сообщать пользователю класса лишней, не нужной ему информации.

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

И никак не могу согласиться с тем, что вынос функций (не методов!) в отдельный юнит "убивает ООП".

прежде чем такое говорить, читай то что написано полностью. Он сказал о том чтобы вынести код метода в функцию в другой юнит.
Если бы ты читал все внимательно, то последние три пункта не написал бы, дабы не повторить все, что было уже сказано
PM ICQ   Вверх
Teleport
Дата 25.8.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2 Keeper89 - про сворачивание знаю.  smile 

2 bems - о твоих способах я не слышал даже. Спасибо, мне будет полезно почитать про него и попробовать в действии.

2 Frees 
Цитата(Frees @  21.8.2009,  18:21 Найти цитируемый пост)
если он те мешается напиши в другом юните функцию и вызывай ее в методе
получется что ты перенесеш код в другой юнит но сути это не изменит 

- нну да, к такому выводу я тоже пришел.

2 mongoloid -  Спасибо. Буду выносить чистые функции.
Цитата(mongoloid @  23.8.2009,  12:06 Найти цитируемый пост)
о, сдается мне, пока вам рановато думать об этом.

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


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



--------------------
user posted image
user posted image 
PM MAIL   Вверх
CodeMonkey
Дата 25.8.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



На DK сейчас идёт аналогичное обсуждение.

Цитата(Teleport @  25.8.2009,  10:18 Найти цитируемый пост)
Вобщем, буду методы большие разбивать на несколько функций, а чистые функции выносить уже в другие юниты.Думаю, что это оптимальное решение. Или кто-то возразит против этого метода? 

Нет, это абсолютно правильно. Большие и сложные функции нужно разбивать на несколько более мелких подзадач. Любая книжка по рефакторингу вам ясно объяснит что зачем и почему так ;)


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


Опытный
**


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

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



2 CodeMonkey - спасибо. Читаю сижу.
Всем спасибо за помощь. Думаю, что вопрос решен.  smile 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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