Информация об изменениях

Сообщение Re[5]: Языки программирования через 10 лет от 16.03.2015 8:48

Изменено 16.03.2015 9:09 Философ

Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, Философ, Вы писали:


Ф>>Да, говно, но не поэтому (не из-за var блока и не из-за скобочек).

Ф>>Из-за модульной парадигмы (namespace'ов приделанных сбоку, unit vars, initialization/finaliztion), из-за наследования конструкторов, и тучи других причин масштабом поменьше.

ARK>namespace'ы не нужны, а вот глобальные переменные это да, плохо.


Ф>>из-за наследования конструкторов


ARK>А что в этом плохого?


Потому, что профит от метаклассов полностью перекрывается тем, что это порождает трудноуловимые ошибки.
Попробуй, найти здесь ошибку вот здесь:
  В чём ошибка я уже сказал
unit MyFuckingUnit;

interface

implementation

type TA = class (TObject)
protected
  FPrivateIntVar :Integer;
public
  constructor Create(p_int :Integer);
  procedure WriteHimself();
end;

type TB = class (TA)
public
  constructor Creatе(p_int :Integer);
end;


type TC = class (TB)
public
  constructor Creatе(p_int :Integer);
end;

var obj :  TA;
{ TA }

constructor TA.Create(p_int :Integer);
begin
  FPrivateIntVar := -1;
end;

procedure TA.WriteHimself;
begin
 WriteLn(FPrivateIntVar);
end;

{ TB }

constructor TB.Creatе(p_int: Integer);
begin
 inherited Create(p_int);
 FPrivateIntVar := p_int;
end;

{ TC }

constructor TC.Creatе(p_int: Integer);
begin
 inherited Creatе(p_int);
 FPrivateIntVar := p_int;
end;

initialization
  obj := TC.Create(1);
  obj.WriteHimself(); //Ожидаем 1 увидеть, ибо в конструкторе "FPrivateIntVar := p_int" правильно? Запусти, и посмотри.
end.


Это крохотный пример из одного файла, и уже всё непросто. Что будет, если у тебя >1000 файлов в проекте?
Re[5]: Языки программирования через 10 лет
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, Философ, Вы писали:


Ф>>Да, говно, но не поэтому (не из-за var блока и не из-за скобочек).

Ф>>Из-за модульной парадигмы (namespace'ов приделанных сбоку, unit vars, initialization/finaliztion), из-за наследования конструкторов, и тучи других причин масштабом поменьше.

ARK>namespace'ы не нужны, а вот глобальные переменные это да, плохо.


Ф>>из-за наследования конструкторов


ARK>А что в этом плохого?


Потому, что профит от метаклассов полностью перекрывается тем, что это порождает трудноуловимые ошибки.
Попробуй, найти здесь ошибку вот здесь:
  В чём ошибка я уже сказал
unit MyFuckingUnit;

interface

implementation

type TA = class (TObject)
protected
  FPrivateIntVar :Integer;
public
  constructor Create(p_int :Integer);
  procedure WriteHimself();
end;

type TB = class (TA)
public
  constructor Creatе(p_int :Integer);
end;


type TC = class (TB)
public
  constructor Creatе(p_int :Integer);
end;

var obj :  TA;
{ TA }

constructor TA.Create(p_int :Integer);
begin
  FPrivateIntVar := -1;
end;

procedure TA.WriteHimself;
begin
 WriteLn(FPrivateIntVar);
end;

{ TB }

constructor TB.Creatе(p_int: Integer);
begin
 inherited Create(p_int);
 FPrivateIntVar := p_int;
end;

{ TC }

constructor TC.Creatе(p_int: Integer);
begin
 inherited Creatе(p_int);
 FPrivateIntVar := p_int;
end;

initialization
  obj := TC.Create(1);
  obj.WriteHimself(); //Ожидаем 1 увидеть, ибо в конструкторе "FPrivateIntVar := p_int", правильно? Запусти, и посмотри.
end.


Это крохотный пример из одного файла, и уже всё непросто. Что будет, если у тебя >1000 файлов в проекте?

Надо на собеседованиях для делфистов такие вопросы задавать. Давать вот этот код, и спрашивать: в каком случае на экране будет (-1) и почему?