function и class function - в чём разница?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: function и class function - в чём разница?

Сообщение alexey38 » 24.03.2013 12:23:28

absdjfh писал(а):А разве просто отдельный модуль для такого случая не будет более наглядным? Впервые о таком способе слышу...

Стилистически это будет равнозначно. Вы можете создать модуль ХХХ или класс ХХХ. В обоих случаях можно обращаться через "ХХХ.имя переменной", т.е. это два способа создания пространства имен.

Но создание модуля - это создание файла. Если Вам требуется структурировать на 1000 групп, то создать 1000 файлов можно, но не всегда удобно. Поэтому если группа большая, то логично для нее выделить отдельный модуль. Если группа из 2-х переменных, то отдельный модуль - это не рационально.

Добавлено спустя 4 минуты 34 секунды:
absdjfh писал(а):ридумал наглядный пример применения class var:
Пусть есть класс THuman. Пусть его поведение зависит от другого класса, который объявлен для наглядности его полем - class var Pr: TPresident.
Далее состояние поля Pr изменилось. Тогда должно измениться поведение одновременно всех THuman, а не отдельно взятых экземпляров этого класса, т. к. Pr у всех одинаковый. Pr можно было бы объявить как глобальную переменную, но если она предназначена только для одного класса, а другим она не нужна, то использование ее внутри класса нагляднее.

Пример наглядный, но в практических задачах такое редко бывает. При развитой структуре классов становится непонятным, в какой из классов нужно отнести подобные общие для всех значения. В Вашем примере, Вы будете иметь 7 млрд. экземпляров класса THuman, и для 1 млрд. Pr будет одним, а у других 6 млрд. Pr - другим. Общемировых констант бывает не так уж и много, а если она такая есть, то ее проще задать глобальной константой.

Добавлено спустя 51 секунду:
absdjfh писал(а):Для наглядности прошу обратить внимание на эти функции класса Tobject

Вот это действительно часто применяемая область.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: function и class function - в чём разница?

Сообщение vitaly_l » 24.03.2013 12:52:40

absdjfh писал(а):это позволяет повысить читабельность

Спасибо, понял.
absdjfh писал(а):Предполагаю, что примерно для того же, что и типизированная константа в процедурах. Это - некоторая характеристика всего класса объектов, присущая одновременно всем объектам, а не отдельному экземпляру.

Ого... а вот это уже очень сильно... и очень круто меняет предназначение class var... если это работает, а не предположение... А если это не работает, то такую возможность нужно добавить в Pascal-Lazarus. Переменная имеющая конкретный несменяемый выделенный адрес в памяти.
:arrow: Только непонятно - в данный момент в Lazaruse это реально работает или предположение/идея? :|
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение absdjfh » 24.03.2013 13:20:33

vitaly_l писал(а):Только непонятно - в данный момент в Lazaruse это реально работает или предположение/идея?

Если вы меня правильно поняли - то да, это работает. Я предполагал лишь то, что это используется, а не то, что так возможно вообще.
Вот пример кода:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

type
  THuman = class
    class var Pr: string;
  end;

var
  Human1, Human2: THuman;

begin
  Human1.Create;
  Human1.Pr:= 'Putin';
  WriteLn(Human1.Pr); // Putin
  WriteLn(Human2.Pr); // Putin, при этом Human2 даже не создан
  Human2.Pr := 'Lukashenko';
  WriteLn(Human1.Pr); // Lukashenko
  WriteLn(THuman.Pr); // Lukashenko
  ReadLn;
end.

Кстати: получается, что
Код: Выделить всё
THuman = class
  class var S: string
end;

равносильно
Код: Выделить всё
{$static on}
THuman = class
  S: string; static;
end;

:idea: ???
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: function и class function - в чём разница?

Сообщение vitaly_l » 24.03.2013 14:06:05

absdjfh писал(а): да, это работает.

Спасибо. Попробую пере-идентифицировать модуль с таким параметрами.

absdjfh писал(а):{$static on}

До этих директив я пока ещё не дошёл...
Если я правильно понимаю - это переводит FPC в режим статических функций и переменных,
смысл которых меной, пока ещё - не идентифицирован, однако вот цитата:
static - статический - локальные идентификаторы, существующие в процессе всех выполнений блока. В отличие от идентификаторов типа auto, для идентификаторов типа static память выделяется только один раз - в начале выполнения программы, и они существуют, пока программа выполняется.





.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение absdjfh » 24.03.2013 14:26:44

vitaly_l писал(а):это переводит FPC в режим статических функций и переменных

Эта директива лишь допускает использование ключевого слова static после объявления поля класса или чего-нибудь еще (1.1.72 в programmer's guide http://www.freepascal.org/docs-html/prog/progsu72.html#x78-770001.1.72), которое, в свою очередь, ведет себя так, как описано в цитате или в разделе 5.3 в reference guide (http://www.freepascal.org/docs-html/ref/refse27.html#x63-700005.3).

Добавлено спустя 3 минуты 38 секунд:
В programmer's guide, к тому же, подтверждается, что class var - чистый эквивалент использованию static, также как и class function.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru