Подтвердить что ты не робот

Почему С# и Java требуют, чтобы все было в классе?

Казалось, что этот вопрос следовало задавать раньше, но поиск не нашел ничего.

Я всегда задавался вопросом, что заставляет нас вкладывать каждый бит кода в класс или интерфейс. Я, кажется, помню, что есть некоторые преимущества, требующие функции main(), такой как C, но ничего для классов. Такие языки, как Python, в некотором роде еще более объектно ориентированы, чем Java, поскольку у них нет примитивов, но вы можете размещать код везде, где хотите.

Является ли это своего рода "неправильной интерпретацией" ООП? В конце концов, вы можете написать процедурный код, как в C, и поместить его внутри класса, но он не будет ориентирован на объекты.

4b9b3361

Ответ 1

Я думаю, что цель требовать, чтобы все было заключено в классы, - это минимизировать количество понятий, с которыми вам нужно иметь дело на языке. На С# или Java вам нужно только понять объектную модель (хотя это довольно сложно). Однако у вас есть только классы с членами и экземплярами классов (объектов).

Я думаю, что это очень важная цель, которую большинство языков пытаются так или иначе придерживаться. Если у С# был некоторый глобальный код (например, чтобы разрешить интерактивную оценку и спецификацию кода запуска без метода Main), у вас будет одна дополнительная концепция для изучения (код верхнего уровня). Выбор, сделанный С#/Java, - это, конечно, один из способов добиться простоты.

Конечно, речь идет о том, является ли это правильным выбором. Например:

  • В функциональных языках программы структурируются с использованием типов (деклараций типов) и выражений. Тело программы - это просто выражение, которое оценивается, что намного проще, чем класс с помощью метода Main, а также позволяет создавать интерактивные скрипты (как в Python).

  • В Erlang (и аналогичных языках) программа структурирована как одновременное выполнение процессов с одним основным процессом, который запускает другие процессы. Это совершенно другой подход, но он имеет смысл для некоторых типов приложений.

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

Как замечание, я считаю, что использование метода Main является довольно спорным выбором (возможно, наследующим от языков C/С++). Я бы предположил, что более ясное объектно-ориентированное решение - это запустить программу, создав экземпляр некоторого класса Main.

Ответ 2

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

Акцент на программировании в целом и вдали от программирования в малом означает, что иногда вокруг небольших программ происходит множество "церемоний". Используя это, класс, который, главный бла-бла-бла, все, чтобы написать "привет мир".

Свойство "однострочная программа - одна строка длиной" было бы неплохо иметь в С#. Мы рассматриваем возможность использования кода вне классов в небольших программах в качестве возможной функции в гипотетической будущей версии С#; если у вас есть конструктивные мнения про или против такой функции, не стесняйтесь отправлять их мне через контактную ссылку в моем блоге.

Ответ 3

Я думаю, что идея с Java заключалась в том, что класс верхнего уровня будет представлять собой единую единицу кода, которая будет скомпилирована в отдельный файл .class. Идея заключалась в том, что эти дискретные, автономные единицы кода затем могут быть легко разделены и объединены во многие проекты (так же, как плотник может комбинировать основные части, такие как орехи, болты, куски дерева и т.д., Чтобы сделать множество предметов). Класс рассматривался как самая маленькая, самая основная атомная единица, и, следовательно, все должно быть частью класса, чтобы упростить сбор больших программ из этих частей.

Можно утверждать, что обещание объектно-ориентированного программирования легко скомпонованного кода не получилось очень хорошо, но назад, когда разрабатывалась Java, цель ООП заключалась в создании небольших единиц (классов), которые можно было бы легко объединить в создавать уникальные программы.

Я предполагаю, что у С# были одни и те же цели.