Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизООП и 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;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.032 c