Модули vs namespace's

Очень просто:

namespace A;
  namespace B;
    namespace C;
    end;
  end;
end;

. Разве удобно (в плане отступов)? Я бы делал так:

namespace A;
end;

namespace A.B;
end;

namespace A.B.C;
end;

. На мой взгляд, лучше - вложенность минимизирована. Вложенность в плане отступов.

И что Вас смущает?

Кому как. Мне бы понравилось. В C# так делают. Ваш вариант - для случая, если неймспейсы в разных файлах.

Но кто-то разве запретил его использовать и в одном?

Тут то же самое, что и в классах. Раньше в классе нельзя было описывать тела методов. “отступов” не было, а геморрой был.

Лично я предпочитаю описывать вне классов тела методов. Так как при прочтении класса сразу видно что в нём есть. А реализацию можно посмотреть ниже. :slight_smile: Но тут вопрос вкуса.

Но, все же, если говорить о том, как все же в кладывать одно пространство имён в другое - я бы выбрал свой вариант, так как это в некотором смысле стандартизирует код: независимо от того в разных файлах или одном описываются пространства имён их стиль вкладывания одного в другое будет единым.

Да, но вот копаться среди методов снизу - не лучшая затея. Особенно, если классов несколько и присутствуют методы класса Program. Именно поэтому ввели сокращённый синтаксис модулей, а в C# о таком делении и не слышали. Я считаю, надо сделать как с классами. Можно и так и так.

Можно, например, воспользоваться регионами для группировки реализаций методов. Но проблема в том, что они не всегда работают.

Может пригодиться:

b236294

Да, это ровно то что надо. Если делать, то именно так.

Я понимаю, что это сложнее. Думаю, ibond проще было сделать на базе unit и library, поскольку там пространство имен автоматически создается

2 лайка

Тогда, как Вы смотрите на постановку точки с запятой после имени пространства имён?

Админ, а не смущает, что Begin в Паскале обозначает ТОЛЬКО начало исполнимого блока, а end - конец любого блока. Зачем Begin после неймспейсов?

begin - это открывающая скобка. Пусть операторная, но все равно - скобка. Начало блока. Вовсе не обязательно исполняемого. В синтаксисе языка паскаль блок - любая последовательность операторов, в том числе, пустая, помещенная в операторные скобки.

В классах, структурах и интерфейсах роль Begin играет, собственно, тип. Делать исключение для неймспеса - не лучшая идея.

Пока я не составил своего мнения.

Вот как это сделано в Oxygene https://www.elementscompiler.com/elements/oxygene/language.aspx#namespaces

Но не забываем, что в Паскале основная структура задается модулями, подключаемыми в секции uses

Ну так я о таком и говорил.

А если свои неймспейсы так же подключать?

Конечно.

Но еще надо как-то файл, содержащий namespace, подключать к проекту. Здесь видимо подходит синтаксис, сделанный @ibond - через {$includenamespace Хотя это сразу требует, чтобы в файле был ровно один namespace.

Впрочем, в Oxygene так же

Да, но можно ведь как с модулем поступить? Просто Uses? Требования то практически те же.

Будет требоваться и указывать в uses и подключать файл. Если конечно не допустить, что имя namespace совпадает с именем файла. Но тогда непонятно, как в нескольких файлах помещать в одно пространство имен.