Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.6 MB
Время: 0.034 c
1-1086902873
CyberSpy
2004-06-11 01:27
2004.06.27
Listview


8-1081935418
pr
2004-04-14 13:36
2004.06.27
прожектора


14-1086509878
Рамиль
2004-06-06 12:17
2004.06.27
Не доступен symantec.com


1-1087061010
Supreme
2004-06-12 21:23
2004.06.27
Как прочитать содержимое памяти, занятое другой прогой


1-1087279731
Olsher
2004-06-15 10:08
2004.06.27
Как выяснить, работает ли программа или уже завершилась?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский