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

Вниз

ООП и arrays   Найти похожие ветки 

 
AAAlexeyAAA   (2004-06-09 12:33) [0]

Добрый день мастера. Есть вопрос о том КАК красиво пользоваться ООП. У меня есть два динамических массива of integer. Ях их читаю из 2-ух тхт файлов. Далее я их преобразовываю и результат вывожу в тхт файл одним массивом. если бы это было бы в паскале, то:

procedure ReadTxtFiles;//читаю файлы и создаю дин. массивы
procedure Calculate;// считаю, пересчитываю
procedure WriteToFile; //пишу ответ в тхт
Все три процедуры запихиваю в процедуру Raschet и всё!

Вопрос: Как сделать это в ООП?...Неужели все три процедуры повесить на кнопку, обработчик события? и всё...и это всё ООП?

Или быть может создать кроме формы ещё один юнит...там создать свой объект...и т.д. и т.п...А в обработчике события на кнопке вызвать тот объект, из другого юнита.  Моя проблема вот в чем: где НУЖНО создавать свой объект, а где нет? В чём удобство и превосходство ООП. Конкретно на моей задаче...


 
Романов Р.В. ©   (2004-06-09 12:40) [1]

Если вы часто используете этот алгоритм то имеет смысл оформить его в класс.


 
KSergey ©   (2004-06-09 12:41) [2]

Ну и не морочьтесь с ООП
Вот когда понадобиться - вы это сразу поймете ;)


 
Sandman25 ©   (2004-06-09 12:45) [3]

Надеюсь, у процедур есть параметры...


 
Романов Р.В. ©   (2004-06-09 12:49) [4]

Удалено модератором
Примечание: Дубль


 
Anatoly Podgoretsky ©   (2004-06-09 13:52) [5]

Пока смысл использования объектов не виден.


 
AAAlexeyAAA   (2004-06-09 14:13) [6]

Я кажется понимаю.
А если бы это было поставлено на конвеер: считка файлов, пересчёт, и запись в новые,...к примеру раз 50-100 в минуту(в контексте какой-то операции программы), то смысл бы имел бы создать свой объект, верно?


 
Романов Р.В. ©   (2004-06-09 14:20) [7]

Можно вполне обойтись без объекта одной процедурой
ReadAndWrite(FileName1, FileName2, SaveName: string);


 
Семен Сорокин ©   (2004-06-09 14:21) [8]

AAAlexeyAAA   (09.06.04 14:13) [6]
Хочешь ООП?
Сделай наследника TFileStream (например), и читай в нем данные во внутреннюю (закрытую) структуру, туда-же добавь необходимые тебе закрытые\открытые методы.


 
PVOzerski ©   (2004-06-09 14:24) [9]

IMHO, смысл появился бы, если бы: а) параллельно делалась бы обработка несколльких пар файлов (и то для удобства программирования, а не для эффективности самой системы); б) если бы пары файлов в разных случаях должны были бы обрабатываться по-разному, но в рамках одной схемы (т.е. имело бы смысл написание базового класса и классов-наследников).


 
DieHard   (2004-06-09 14:25) [10]

AAAlexeyAAA (09.06.04 14:13) [6]
Не 50-100 раз в минуту, а в 50-100 проектах


 
PVOzerski ©   (2004-06-09 14:31) [11]

>Не 50-100 раз в минуту, а в 50-100 проектах
Разве что если тогда компонент делать, чтобы на форму "кидать" :^)
А так - достаточно написание юнита с процедурами.


 
Weber ©   (2004-06-09 14:34) [12]

Примерно так:

TMyArray = class
private
 FElems: TIntegerDynArray;
 function GetElem(AIndex: Integer): Integer;
 procedure SetElem(AIndex, Value: Integer);
public
 function LoadFromFile(AFileName: String);
published
 property Elems[AIndex: Integer]: Integer read GetElem write SetElem; default;
end;

procedure Calculate(var First, Second: TMyArray);
{ всё больше никаких функций/процедур не надо }


 
Weber ©   (2004-06-09 14:35) [13]


> Weber ©   (09.06.04 14:34) [12]

Изврат заказывали?


 
Семен Сорокин ©   (2004-06-09 14:36) [14]

Weber ©   (09.06.04 14:34) [12]
а зачем здесь published-секция?


 
Sandman25 ©   (2004-06-09 14:43) [15]

+ зачем var у параметров Calculate?


 
Романов Р.В. ©   (2004-06-09 14:45) [16]

Щас бы синий карандаш :)


 
AAAlexeyAAA   (2004-06-09 14:50) [17]

>Не 50-100 раз в минуту, а в 50-100 проектах
..т.е. например...у меня массивы real в объекте...
Нужно использовать объекты когда:
1 в первом случае мне нужно "сложить массивы" (одинаковые по размерам)
2. во втором округлить до целых выход массив
3. в третьем "вычесть из первого - второй"

тогда я наследую весь объект, а процедуру calculate заменяю...

это будет ООП, верно?


 
GuAV ©   (2004-06-09 14:58) [18]

имхо, нефиг дин.массив в класс запузыривать!
для дин массива применим compliler magic - reference count и finalize по выходу из прцедуры, что помогает избежать утечки памяти и нерациональное использование оной.

зы я бы делал
type TCalcProc=procedure(A: array of  Integer);

procedure ExecCalcProc(Proc: TCalcProc);


 
PVOzerski ©   (2004-06-09 15:08) [19]

Я-то имел в виду нечто такое:
type
tArray=array of real;
tArrayProcessor=class
private
 ...
public
 procedure LoadFromFiles(const names:array of string);
 function Calculate:tArray;virtual;
end;


 
Weber ©   (2004-06-09 15:08) [20]


> Семен Сорокин ©   (09.06.04 14:36) [14]
> Weber ©   (09.06.04 14:34) [12]
> а зачем здесь published-секция?
>
> Sandman25 ©   (09.06.04 14:43) [15]
> + зачем var у параметров Calculate?

Чтобы поизвратнее!
Человек же просил ООП для динамических массивов, вот пжалста!
На большее фантазии не хватило, вот за это вы уж меня простите... :))))


 
AAAlexeyAAA   (2004-06-09 15:09) [21]

<<помогает избежать утечки памяти и нерациональное использование оной>>

<<применим compliler magic - reference count >>

а можно поподробнее...? (пример)


 
Weber ©   (2004-06-09 15:16) [22]

Можно ещё извратистее:

TMyArray = class
private
 ...
public
 ...
 function Add(Param: TMyArray): TMyArray;
end;


 
GuAV ©   (2004-06-09 15:21) [23]


> а можно поподробнее...? (пример)

procedure P;
var A: array of Integer;
begin
 SetLength(A,10000);
 A[0]:=5;
end;

этот код не должен вызвать утечки памети
procedure P1;
var A: tArrayProcessor;
begin
 A:=tArrayProcessor.Create;
end;

этот должен вызвать

это про утечку. про reference-count по F1


 
GuAV ©   (2004-06-09 15:22) [24]


> type TCalcProc=procedure(A: array of  Integer);

type TCalcProc=procedure(var A: array of  Integer);


 
Weber ©   (2004-06-09 15:23) [25]


> A:=tArrayProcessor.Create;

Кто хоть так делает?


 
PVOzerski ©   (2004-06-09 15:27) [26]

>procedure P1;
>var A: tArrayProcessor;
>begin
> A:=tArrayProcessor.Create;
>end;
>этот должен вызвать
Если деструктор не вызывать, то конечно. Только почему бы его не вызвать в свое время?


 
GuAV ©   (2004-06-09 15:32) [27]


> Если деструктор не вызывать, то конечно. Только почему бы
> его не вызвать в свое время?

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


 
PVOzerski ©   (2004-06-09 15:38) [28]

>я про то что работать с дин.массивами - одно удовольствие, а с классами и налажать недолго.
IMHO это зависит только от кривости рук. Можно "налажать" не то что с динамическими массивами - даже со статическими :^)


 
Sandman25 ©   (2004-06-09 15:38) [29]

[26] PVOzerski ©   (09.06.04 15:27)

А вдруг это наследник TComponent и в конструкторе вызывается какой-нибудь inherited Create(Application)? :)


 
GuAV ©   (2004-06-09 15:40) [30]


> А вдруг это наследник TComponent и в конструкторе вызывается
> какой-нибудь inherited Create(Application)? :)

ВО! так и надо в этом случае поступить :)


 
PVOzerski ©   (2004-06-09 15:41) [31]

Если это тот класс, который я выдумал в [19], у него предок один - tObject :^). А при наличии богатой фантазии насоздавать "подводных камней" на ровном месте можно где угодно.


 
Семен Сорокин ©   (2004-06-09 15:42) [32]


> GuAV ©   (09.06.04 15:32) [27]
> я про то что работать с дин.массивами - одно удовольствие,
> а с классами и налажать недолго.

По мне так с классами удобней работать, тот же TList, чем с динамическими массивами, но это дело привычки. Другое дело производительность...


 
PVOzerski ©   (2004-06-09 15:43) [33]

Предлагаю переделать под ООП сложение двух integer"ов и напридумывать как можно больше проблем! :^))


 
evvcom ©   (2004-06-09 15:43) [34]


> имхо, нефиг дин.массив в класс запузыривать!

Хорошо, что "имхо". Я с этим категорически не соласен.

> я про то что работать с дин.массивами - одно удовольствие,
> а с классами и налажать недолго

Кому как (про удовольствие). Все зависит от задачи, а то и с дин. массивами можно "налажать", а класс один раз отладил и никаких проблем. Заботиться надо только о Create/Free.


 
Sandman25 ©   (2004-06-09 15:44) [35]

[33] PVOzerski ©   (09.06.04 15:43)

Это слишком сложно. Лучше изменение знака у одного. Без метода проверки на 0 никак... :)


 
AAAlexeyAAA   (2004-06-09 16:02) [36]

так вот если сделать с помощью объектов(A) или в тупую под  обработчиком... (кнопкой)... в классе TForm(B)
1. Объём кода (писанины)
2. Объём файла (exe)
3. Скорость рабоыт приложения
4. Простота (наглядность)
5. Возможность для более простого (будущего) изменения кода


 
GuAV ©   (2004-06-09 16:03) [37]


> Лучше изменение знака у одного

сложная задача. учитывая что на некоторых платвормах максимальное положительное по модулю равно мин. отрицательному, и нуля два +0 -0. :)

идея реализации.
начинать с класса интежер в котором в protected доступ к битам как к массиву... разумеется бит - тоже класс :)


 
Weber ©   (2004-06-09 16:09) [38]


> разумеется бит - тоже класс :)

О боже, сумасшедший дом! ... Я по адресу! :))))


 
GuAV ©   (2004-06-09 16:18) [39]


> Я по адресу! :))))

Разумеется переменную класса бит следует передавать по адресу а не по значению. Это же ООП :)


 
Anatoly Podgoretsky ©   (2004-06-09 16:22) [40]

И в трехзвенной архитектуре


 
GuAV ©   (2004-06-09 16:26) [41]


> И в трехзвенной архитектуре

а это как?


 
Anatoly Podgoretsky ©   (2004-06-09 16:33) [42]

Клиент - сервер приложений - база данных


 
GuAV ©   (2004-06-09 16:39) [43]


> Клиент - сервер приложений - база данных

Спасибо. Я просто с БД вообще не знаком.


 
Algol   (2004-06-09 16:44) [44]


> type TCalcProc=procedure(var A: array of  Integer);


Сие плохо ....


 
Григорьев Антон ©   (2004-06-09 16:45) [45]


> PVOzerski ©   (09.06.04 15:43) [33]
> Предлагаю переделать под ООП сложение двух integer"ов и
> напридумывать как можно больше проблем! :^))


Можете смеяться, но ООП c этого и началось. Был такой язык - SmallTalk. Первый ОО-язык. В нём все типы, в т.ч. и целые, были объектами. И даже операторов цикла не было, потому что последовательность операторов рассматривалась как объект, и у этого объекта были методы повторения. Кстати, все методы были виртуальными. Это уже позже люди додумались, что методы могут быть статическими, а ООП совместимо с императивным программированием.


 
GuAV ©   (2004-06-09 16:52) [46]


> Сие плохо ....

Виноват, исправлюсь :(

> Можете смеяться

Хочу посмеятся. Где cкачать SmallTalk?


 
Григорьев Антон ©   (2004-06-09 17:02) [47]


> Хочу посмеятся. Где cкачать SmallTalk?


Никогда не слышал о SmallTalk"е для виндов. Он работал только под специальной ОС, которая тоже называлась SmallTalk. Все мои сведения об этом взяты из книги http://www.delphikingdom.com/asp/book.asp?BookID=63


 
Anatoly Podgoretsky ©   (2004-06-09 17:17) [48]

GuAV ©   (09.06.04 16:39) [43]
Третье звено не обязательно база, пуская будет ООП движок


 
Sandman25 ©   (2004-06-09 17:45) [49]

[45] Григорьев Антон ©   (09.06.04 16:45)

А теперь опять в Java появились Integer и для указания того, что метод не виртуальный, требуется спецификатор... Диалектика, понимаешь...


 
AAAlexeyAAA   (2004-06-09 18:02) [50]

да уж...обговорили мой вопрос...
(09.06.04 16:02)....вообще проигнорировали...:(
На входе в форум есть хороший hint у ссылки: "здесь вы можете задать свой вопрос и НАВЕРНЯКА получить ответ"...
разве что "наверняка"....
благодарю за советы: Романов Р.В., Anatoly Podgoretsky, PVOzerski, DieHard.


 
GuAV ©   (2004-06-09 18:50) [51]

AAAlexeyAAA   (09.06.04 18:02) [50]
оставь как есть через процедуры - уже был этот ответ.
это будет имхо по всем пунктам

******
GuAV ©   (09.06.04 16:03) [37]
type
 TBoolean=class;
 TInteger=class;

 TCustomInteger=class(TComponent)
 private
   FValue: array[1..4] of char;
   function GetBits(Index: TInteger): TBoolean;
   procedure SetBits(Intex: TInteger; const Value: TBoolean);
 protected
   property Bits[Index: TInteger]: TBoolean read GetBits write SetBits;
 end;

 TCustomBoolean=class(TCustomInteger)
 private
   function GetValue: Boolean;
   procedure SetValue(const Value: Boolean);
 protected
   property Value: Boolean read GetValue write  SetValue;
 end;

 TBoolean=class(TCustomBoolean)
 published
   property Value;
 end;

 TInteger=class(TCustomInteger)
 public
   property Bits;
 end;

и так далее.
AAAlexeyAAA, Вам действительно это надо?


 
AAAlexeyAAA   (2004-06-09 21:06) [52]

GuAV, спасибо!
<<AAAlexeyAAA, Вам действительно это надо?>>
да, мне это нужно. иначе я б не обращался на форум.я же не ради забавы это делаю...


 
Fay ©   (2004-06-09 21:24) [53]

Извращение какое-то... 8)
type
 TIntegerType = class(TObject)
 private
   FValue : Integer;
   FOnChange : TNotifyEvent;
   procedure SetValue(v : Integer);
 protected
 public
   function GetDiv(n : Integer) : Integer;
   function GetMod(n : Integer) : Integer;
   constructor Create;
   destructor Destroy; override;
 published
   property Value : Integer read FValue write SetValue default 0;
   property OnChange : TNotifyEvent read FOnChange write FOnChange;
 end;

implementation

constructor TIntegerType.Create;
begin
 FValue := 0;
 FOnChange := nil;
end;

destructor TIntegerType.Destroy;
begin
 inherited;
end;

procedure TIntegerType.SetValue(v : Integer);
begin
 FValue := v;
 if Assigned(FOnChange) then FOnChange(Self);
end;

function TIntegerType.GetDiv(n : Integer) : Integer;
begin
 Result := FValue div n;
end;

function TIntegerType.GetMod(n : Integer) : Integer;
begin
 Result := FValue mod n;
end;


 
GuAV ©   (2004-06-09 23:24) [54]

Fay ©   (09.06.04 21:24) [53]

> constructor TIntegerType.Create;
> begin
>  FValue := 0;
>  FOnChange := nil;
> end;

незаче это, поля нулятся автоматически.

> destructor TIntegerType.Destroy;
> begin
>  inherited;
> end;

тогда смысл объявлять - ?

и ваще просили сложить или знак поменять - а это тогда что? оффтопик :)


 
PVOzerski ©   (2004-06-10 11:43) [55]

А как такое: ;^)

asm.operand1.value:=asm.registers.EAX;
asm.operand2.value:=1;
asm.MOV;


 
GuAV ©   (2004-06-10 12:01) [56]


> asm.MOV;

нееет.
методов у этого варианта/интерфэйса/класса многовато получится.
надо так
asm.instruction(AI_MOV);


 
Anatoly Podgoretsky ©   (2004-06-10 12:23) [57]

GuAV ©   (10.06.04 12:01) [56]
Можно уменьщить
asm.Instruction.AsString := "MOV";
asm.Operand[1].AsReg := EAX;
asm.Operand[2].AsInteger := 1;
asm.Do;



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

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

Наверх




Память: 0.62 MB
Время: 0.058 c
14-1086869679
denis24
2004-06-10 16:14
2004.06.27
иконки для приложений msoffice


4-1084875724
sachem
2004-05-18 14:22
2004.06.27
Как сделать, что бы при закрытии формы вы давалось сообщение


1-1086859760
1008
2004-06-10 13:29
2004.06.27
Работа с динамическими массивами.


14-1085858493
Nick-From
2004-05-29 23:21
2004.06.27
Как написать рецензию на диплом?


14-1086286974
Потеряв однажды ник
2004-06-03 22:22
2004.06.27
Сколько вам лет