OberonCore
https://forum.oberoncore.ru/

Есть ли coding style для Оберонов?
https://forum.oberoncore.ru/viewtopic.php?f=86&t=5618
Страница 1 из 1

Автор:  Rifat [ Понедельник, 08 Февраль, 2016 16:08 ]
Заголовок сообщения:  Есть ли coding style для Оберонов?

Например, меня интересует такой момент, как лучше описывать параметры функции, сначала выходные параметры или же сначала входные параметры?
То есть PROCEDURE A(VAR a: INTEGER; b: INTEGER); или PROCEDURE A(b: INTEGER; VAR a: INTEGER);
Второй случай мне кажется более естественным, но с другой стороны, когда выполняется присваивание a := b имеем, что "выходной" параметр как бы слева, а "входной" справа.

Также возникает вопрос, как обозначать, что параметр выходной в следующем случае, например:
TYPE PRec = POINTER TO RECORD a: INTEGER END;

(* Здесь p выглядит как входной параметр. *)
PROCEDURE Change(p: PRec);
BEGIN
p.a := 10;
END Change.

Автор:  Александр Ильин [ Понедельник, 08 Февраль, 2016 16:30 ]
Заголовок сообщения:  Re: Есть ли coding style для Оберонов?

Входные параметры традиционно слева, выходные - справа. Операция присвоения в этом смысле исключение, хотя она и не является процедурой, чтобы попадать под это правило. Операция копирования строк, например: COPY(from, to). Движение данных в порядке чтения - слева направо.

Если меняется единственный параметр, можно это как-то отражать в имени процедуры, например, словом Change, Update, Modify и т.п. В любом случае, это должно быть семантическое соглашение внутри проекта - работать в функциональном или процедурном стиле с той или иной сущностью. Синтаксически это не отражается. В крайнем случае можете делать модифицируемые переменные VAR-параметрами, но это может только усилить путаницу в некоторых случаях.

Если меняется содержимое объекта или записи в зависимости от некоторых параметров, то ссылка на изменяемый объект передаётся первой, а всё остальное после неё в порядке убывания значимости. Например: INC(x, 15).

Автор:  Пётр Кушнир [ Понедельник, 08 Февраль, 2016 20:08 ]
Заголовок сообщения:  Re: Есть ли coding style для Оберонов?

Есть в ББ файл Programming Conventions, конечно, но заданного вопроса про процедуры там нет.

Автор:  Илья Ермаков [ Четверг, 11 Февраль, 2016 18:01 ]
Заголовок сообщения:  Re: Есть ли coding style для Оберонов?

Я ввел правило для себя и своих сотрудников - в точке вызова выходные параметры подчеркиваются.

Если указатель, то нет (подразумевается, что любой объект передан в полный доступ, а дальше уже зависит от интерфейса объекта). При проектировании объектов отделяются интерфейсы чтения и модификаций. Допустим, для каких-нибудь контейнеров может быть Reader, Writer, Slider (для позиционирования). При таком подходе понятно, что именно может сделать вызываемая процедура.

Автор:  Rifat [ Пятница, 01 Июль, 2016 10:24 ]
Заголовок сообщения:  Re: Есть ли coding style для Оберонов?

Какие комментарии перед функциями используете?
Пишете ли комментарий в произвольной форме или же там есть определенный набор полей, например: назначение функции, параметры, выходной результат? Какие еще поля используете в комментарии?

Автор:  Александр Ильин [ Пятница, 01 Июль, 2016 12:32 ]
Заголовок сообщения:  Re: Есть ли coding style для Оберонов?

Rifat писал(а):
Какие комментарии перед функциями используете?
Пишете ли комментарий в произвольной форме или же там есть определенный набор полей, например: назначение функции, параметры, выходной результат? Какие еще поля используете в комментарии?
Я в комментариях описываю, что функция делает с каждым из параметров, и каковы их допустимые значения/диапазоны и особые случаи/комбинации значений. Иногда это умещается в одно предложение, иногда каждый из параметров приходится расписывать. Аналогично с выходным значением. Редко приходится отдельно описывать поведение фукнции (например, не возвращает управление, пока не случится то-то).

Код:
Sub SetRowReadOnly (Byval row As Integer, Byval columnUseMap As String)
   ' Set read-only status for all cells of the row according to the
   ' columnUseMap. Where the map contains " ", that cell is not in use, and
   ' must be read-only.

Код:
Function RowToTank (Byval row As Integer) As Integer
   ' Convert ugDevices row number into tank number. This shall be used if and
   ' when we use multiple rows of ugDevices to configure one tank in ugTankCfg.
   ' PRE: 0 <= row < ugDevices.GetNumberRows
   ' POST: 0 <= result < maxNumTanksSupported

Код:
Function GetLastNonEmptyTankIndex As Integer
   ' Return the index of the last tank that has at least one device assigned: 0..maxNumTanksSupported-1
   ' If all tanks are empty, then return -1.

Код:
Function FindSlaveTankPos (Byval slaveType As String, Byval slaveAddr As Integer) As Integer
' Find the first tank position that contains the slave of type slaveType with
' address slaveAddr. Return the tank position number if found, -1 otherwise.
' slaveType is one of ("REX", "RTG", "PRO", "IDAU", "SDAU", "R2410", "Enraf", "Whessoe"),
' otherwise return -1.
' If (slaveAddr <= 0), then return -1, i. e. don't search for non-existing devices.

Код:
Function UpdateSlaveDSFields () As Boolean
' Use data in DataCtx.Variable("POS_DEVICE_ADDR" & Pos) and
' DataCtx.Variable("POS_BUDDY_DEVICE_ADDR" & Pos) to detect slave devices that
' were moved to a new tank position. If there are such devices, use the
' DevCommon.SRF_DS_SETUP (or DevEnraf.csr:SRF_ENRAF_DB_R2460 for Enraf devices)
' to update the slave's DS- and MS-fields. For 2410 tank positions we show a
' warning dialog to make user update their settings.
' Return True if data saved successfully, or False if abort is needed.

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