OberonCore
https://forum.oberoncore.ru/

Расширение записи в классическом Обероне
https://forum.oberoncore.ru/viewtopic.php?f=158&t=6762
Страница 3 из 3

Автор:  AlexBogy [ Пятница, 21 Октябрь, 2022 14:36 ]
Заголовок сообщения:  Re: Расширение записи в классическом Обероне

Comdiv писал(а):
Непересекающиеся настройки, лежащие в одном ряду с пересекающимися, звучат как что-то, пригодное для выделения ядра и его расширений. Условно
Код:
Port = RECORD number, status, speed: INTEGER END;
LanPort = RECORD(Port) lan: LanSpecific END;
OptPort = RECORD(Port) opt: OptSpecific END;
Хотя возможно, что и здесь Port - лишь составляющая соответствующих разъёмов, а не их понятийная основа.

И что такое в данном случае лучшая читаемость и приемлемая вложенность? Чем PortNumber лучше port.number? Обычно наоборот - наличие общего префикса - это звоночек, что используется структура, размазанная по отделённым переменным. Если откроете больше кода, то станет ясней.


Вот такая структура:
Код:
  E1Config=record
    PortNumber: Integer;
    PortStatus: Boolean;
    PortSpeed: Integer;
    PortCode: Integer;
    PortFrame: Integer;
    PortImpedance: Integer;
    PortLBO: Integer;
    PortCrossConnected: Boolean;
  end;
  EthConfig=record
    PortNumber: Integer;
    PortStatus: Boolean;
    PortSpeed: Integer;
    PortFlow: Boolean;
    PortPriority: Integer;
    PortEgressTag: Integer;
    PortIngressTag: Integer;
    PortEgressRate: Integer;
    PortIngressRate: Integer;
    PortSchedule: Integer;
    PortLearning: Boolean;
    PortCrossover: Integer;
  end;
  OPTConfig=record
    PortNumber: Integer;
    PortStatus: Boolean;
    PortSpeed: Integer;
    PortALS: Boolean;
    PortALSDelay: Integer;
    PortDCC: Boolean;
    PortGrouped: Boolean;
  end;

Автор:  Comdiv [ Воскресенье, 23 Октябрь, 2022 22:42 ]
Заголовок сообщения:  Re: Расширение записи в классическом Обероне

По самим структурам без кода их использования всё равно трудно сказать. Может у Вас, вообще, совпадение первых элементов даже не важно, и их, действительно, можно просто так независимо объявить. Но если есть желание не повторяться и соблюсти такое плоское положение элементов, то, конечно, напрашивается наследование базовой структуры. Вот Вам и "мне удобней агрегирование". Не похоже.

Автор:  Иван Денисов [ Воскресенье, 23 Октябрь, 2022 22:55 ]
Заголовок сообщения:  Re: Расширение записи в классическом Обероне

Если я всё правильно понимаю, то вот такая конструкция понимается под "расширением через агрегирование".
Код:
Port=record
    Number: Integer;
    Status: Boolean;
    Speed: Integer;
end;
E1Config=record
    port: Port;
    PortCode: Integer;
    PortFrame: Integer;
    PortImpedance: Integer;
    PortLBO: Integer;
    PortCrossConnected: Boolean;
  end;
  EthConfig=record
    port: Port;
    PortFlow: Boolean;
    PortPriority: Integer;
    PortEgressTag: Integer;
    PortIngressTag: Integer;
    PortEgressRate: Integer;
    PortIngressRate: Integer;
    PortSchedule: Integer;
    PortLearning: Boolean;
    PortCrossover: Integer;
  end;
  OPTConfig=record
    port: Port;
    PortALS: Boolean;
    PortALSDelay: Integer;
    PortDCC: Boolean;
    PortGrouped: Boolean;
  end;

Автор:  Comdiv [ Понедельник, 24 Октябрь, 2022 01:48 ]
Заголовок сообщения:  Re: Расширение записи в классическом Обероне

Судя по истории переписки, сложилось впечатление, что Александру удобней
Код:
Device = RECORD
   e1: E1Config;
   opt: OptConfig;
   eth: EthConfig;
END;
а не воображаемый
Код:
Device = RECORD(E1Config, OptConfig, EthConfig)
END;
для осуществления которого пришлось бы все поля называть по-разному. А о том, что E1Config, OptConfig, EthConfig могут быть расширениями Port с полями Number, Status, Speed он и не думал, ведь это якобы приведёт к лишней вложенности. Поэтому в разных сообщениях он и пишет прямо противоположные вещи - в одном про то, что ему нужен многоэтажный доступ, чтобы все поля не пересекались, а в другом - о лучшей читаемости и приемлемой вложенности, основываясь на перемешанных понятиях расширения и вложения, между которыми он выбирает обобщённо на основе "удобства", а не для каждого случая по разному предназначению.

Автор:  AlexBogy [ Понедельник, 24 Октябрь, 2022 07:08 ]
Заголовок сообщения:  Re: Расширение записи в классическом Обероне

Comdiv писал(а):
Судя по истории переписки, сложилось впечатление, что Александру удобней
Код:
Device = RECORD
   e1: E1Config;
   opt: OptConfig;
   eth: EthConfig;
END;
а не воображаемый
Код:
Device = RECORD(E1Config, OptConfig, EthConfig)
END;
для осуществления которого пришлось бы все поля называть по-разному. А о том, что E1Config, OptConfig, EthConfig могут быть расширениями Port с полями Number, Status, Speed он и не думал, ведь это якобы приведёт к лишней вложенности. Поэтому в разных сообщениях он и пишет прямо противоположные вещи - в одном про то, что ему нужен многоэтажный доступ, чтобы все поля не пересекались, а в другом - о лучшей читаемости и приемлемой вложенности, основываясь на перемешанных понятиях расширения и вложения, между которыми он выбирает обобщённо на основе "удобства", а не для каждого случая по разному предназначению.


Вы совершенно правильно меня поняли, именно так я и сделал в программе. По поводу дальнейшего агрегирования на уровне общих параметров порта - да, можно было сделать и короткую запись с тремя полями. Но смысл был не в том, чтобы делать агрегирование ради агрегирования, а чтобы в записях E1Config, EthConfig, OptConfig все поля были одного уровня, поскольку это одноранговые настройки.

Теперь еще раз про наследование - я не против классического наследования. Просто для меня оно удобнее, когда в базовой и расширенной записи нет и не будет пересекающихся полей.

Хочу выразить благодарность всем откликнувшимся на мой пост.

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/