Есть ли в C # слишком много языковых возможностей? - PullRequest
35 голосов
/ 28 апреля 2009

Это обсуждение, которое время от времени появляется в нашей команде. В то время как некоторые быстро освоили функции C # 3.0, другие придерживаются классических приемов.

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

Но насколько трудно должно быть изучение современного языка программирования? Каждый может решать проблемы, у каждого есть множество других проблем, которые нужно решать каждый день, кроме заботы о более хороших способах его реализации. Обучение людей не бесплатно. С другой стороны, языковые функции могут сделать людей более продуктивными, а код - более понятным.

Вероятно, неполный список возможностей C #

  • классы, структуры, примитивные типы, массивы, бокс, интерфейсы, наследование (абстрактное, виртуальное, новое, запечатанное), свойства, обнуляемые значения
  • Исключения
  • дженериков
  • многопоточность, замки
  • отражение
  • делегаты, события, анонимные делегаты
  • итераторы
  • лямбда-выражения
  • методы расширения
  • * 1030 LINQ *

Скоро выйдет версия 4., включая множество дополнительных функций.

Лично мне нравятся почти все функции C #, и мне нравится короткий и красивый код, который я могу написать на этом языке. Но мне не нужно учить это с нуля.

Меня интересует ваше мнение и ваш опыт изучения или преподавания C #. Уже слишком много функций? Все еще отсутствуют важные функции? Делают ли языковые функции язык более легким в использовании или трудным для изучения?

Пожалуйста: Нет ответов типа "Язык A лучше, чем язык B, потому что ...".

Ответы [ 13 ]

25 голосов
/ 28 апреля 2009

Да, это риск - и его обсуждают лот . Достигается тот момент, когда очень трудно понять с нуля C #. К счастью, ситуация немного стабилизировалась, и языковые изменения между C # 3.0 и C # 4.0 относительно незначительны.

На самом деле, недавно я проделал большую работу, пытаясь решить проблему обобщенных CF , и в рамках этого исправления может фактически случиться, что код возвращается почти к методам C # 1.2 (нет или очень мало, дженерики). Таким образом, большинство проблем можно решить с помощью более простых языковых конструкций. Дело в том: как трудно это сделать ?

Например, анонимные методы добавляют LOT преимуществ при относительно небольшой сложности. dynamic (4.0) добавляет еще несколько для сценариев взаимодействия COM. Блоки итераторов неоценимы для кода в стиле LINQ ...

Я вижу много вопросов о нетривиальных частях C #, и я думаю, что мне будет трудно научить новичка всем C # с нуля. Такие книги, как Jon's C # in Depth, хороши для людей, которые уже знакомы с основами (по крайней мере, C # 1.2; в идеале немного C # 2.0), но на самом деле они не предназначены для новичков (я знаю, что Джон не согласится).

Действительно хитрый. К счастью, команда C # установила планку (для включения) очень высоко; что-то новое должно быть очень полезным, чтобы сделать это на языке.

7 голосов
/ 28 апреля 2009

На мой взгляд, C # не имеет слишком много возможностей. Практически любая из новых модных функций 2.0 и 3.0 полезна мне и моим коллегам каждый день, и даже парень из VB быстро подобрал их. Некоторые из новых функций делают изучение языка еще проще, например, использование встроенных лямбда-выражений вместо делегатов и ключевых слов var и инициализаторов объектов, и это лишь некоторые из названий C # 3.0 (в C # 3.5 нет, кстати, вы путаете что с .NET 3.5).

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

И, по большому количеству возможностей, C # далек от C ++, особенно если вы включите C ++ 0x в этот рисунок, что облегчает изучение, несмотря на то, что у некоторых людей «слишком много возможностей». Моя точка зрения на C ++ заключалась в том, что в C # на самом деле не так много возможностей, если хотите.

5 голосов
/ 04 ноября 2010

Когда я пишу код на C #, я использую практически все его возможности. Не все сразу, но каждая функция C # имеет свое место. Многие люди не знают, что в C # есть оператор «::», и никогда не слышали о « extern alias », но мне пришлось использовать его сегодня, чтобы разрешить конфликт имен между двумя DLL.

«Возврат доходности» - одна из моих любимых функций. Я не использую его каждый день, но я обычно писал интерфейсы IEnumerator вручную в C # 1.0, и это было огромной болью, которую я бы не хотел повторять. Кроме того, это действительно полезно для написания сопрограмм , даже сопрограмм, которые не производят никакого вывода (yield return null = приостановить операцию).

C # имеет внутренние функции и замыкания. Когда я пишу код на C ++, их очень не хватает.

Кажется глупым, что C # имеет так много разных способов написания внутренней функции,

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (int x) => { return x*x; }

Но # 1 только по историческим причинам и формы 2 и 3 имеют свое место.

Будь то методы расширения, перегрузка операторов, обобщенные элементы, общие ограничения, параметры по умолчанию, объединение нулей, троичный оператор, статические конструкторы, проверенные / непроверенные, авто-свойства, директивы препроцессора, типы значений ... как программист на полный рабочий день Я использую все это по крайней мере изредка, и устранение любой из этих функций либо создает для меня дополнительную работу и обострение (foo(x) ?? bar(y) теперь должно быть написано { var temp = foo(x); if (temp == null) temp = bar(y) }), либо требует от меня писать более толстый / медленный код (например, если вы заменяете типы значений классами, часть моего кода будет замедляться, а использование памяти резко увеличится).

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

Уловка позволяет программистам, которые не работают полный рабочий день, понимать. (что касается тех людей, которые программируют на C # все время и до сих пор не могут выучить язык - ну, уволить их?) Возможно, это помогло бы, если бы Microsoft сделала функции более «Googlable» или, по крайней мере, «F1-способны». Например, когда я ставлю курсор на «??» или "=>" и нажмите F1, я должен получить справочную страницу для этих операторов. Или рассмотрим статические конструкторы: если код говорит «статический конструктор ()» вместо «статический MyClassName ()», тогда будет проще найти его в Интернете.

IMO, большая проблема, чем раздувание языка, - раздувание фреймворка. Инфраструктура .NET является гигантской: Microsoft постоянно перевоплощает одни и те же вещи, каждый раз создавая раздутые, несовершенные проекты: WinForms и WPF, различные способы доступа к базе данных и т. Д.

2 голосов
/ 28 апреля 2009

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

Иногда они едва могут понять код, который написан людьми, использующими все новые функции.

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

В чем причина вашей ситуации? Это:

  • Некоторые программисты не понимают новых возможностей
  • Новые функции были использованы не по назначению
  • Новые функции были использованы для устранения недостатков дизайна (часто в случае с отражением)

Я бы поспорил, что это будет смесь вышеперечисленного.

2 голосов
/ 28 апреля 2009

На самом деле много споров о том, как должен развиваться C #. Действительно, некоторые считают, что добавляя много новых функций, язык становится трудным для изучения, но большинство рассматривает C # как язык программирования с множеством парадигм. Прежде всего, это полнофункциональный объектно-ориентированный язык строгого типа, но у него есть концепции, которые до недавнего времени ограничивались функциональными и динамическими языками программирования. Эти функции, хотя они могут показаться запутанными для начинающих, предлагают большую гибкость и мощь, и иногда их может оказаться достаточно, чтобы помешать вам использовать в приложении язык, специфичный для предметной области, и решать все проблемы интеграции. Вы всегда можете поговорить о том, что должно быть реализовано в самом языке и что должно быть частью фреймворка, но имейте в виду, что большинство функций, которые вы упоминаете и считаете излишними, на самом деле являются результатом запросов разработчиков, и они делают обеспечить функциональность, которая отличает C # от других языков (на ум приходит Java). Как только программист привыкнет к этим функциям, он осознает их преимущества.

Вы упомянули Linq, и я должен признать, что сначала я был немного скептически настроен, поскольку я всегда считал, что SQL является вполне естественным языком для работы с данными, но теперь мне действительно нравится и я вижу преимущество в том, что запросы оцениваются во время компиляции. Лямбда-выражения всегда хороши, они могут затруднить чтение кода при чрезмерном использовании, но иногда они действительно упрощают его. Я не большой поклонник ключевого слова 'var', но иногда оно оказывается полезным, и давайте будем честными, если его не использовать при написании Linq, это затруднит чтение кода. Я сам начинающий программист, и я не думаю, что эти концепции трудно выучить. Я также часто использую Java в школе, и я действительно скучаю по некоторым функциям C # (я не говорю, что Java - плохой язык, напротив, в некоторых отношениях я думаю, что он лучше, чем контракты на C #, особенно для академические цели).

2 голосов
/ 28 апреля 2009

Вам, вероятно, следует прочитать это сообщение в блоге Эрика Ганнерсона, члена команды по компиляции C # в Microsoft.

Он объясняет, как новые возможности появляются в языке. В основном они получают «-100 баллов» в начале, «что означает, что это должно оказать значительное положительное влияние на весь пакет, чтобы оно стало языком».

1 голос
/ 24 января 2011

Должно ли быть трудно выучить современный язык программирования?

Для: в идеале вы хотите использовать самый мощный язык, который вы можете, который позволяет вам правильно выражать вещи.

Против: вы хотите думать о проблеме, а не о том, как работает язык.

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

Отредактировано дополнительное размышление: я за то, что стараюсь поддерживать согласованный / логический синтаксис при добавлении функций в язык, но это не тот поток, который необходим для обсуждения на языке lisp.

Существуют ли функции, от которых C # должен избавиться?

Я часто использую новые функции, такие как LINQ, методы расширений, var (я только что написал тип, почему я пишу его снова?) И анонимные функции. Я обнаружил, что они могут дать довольно большие преимущества в производительности. Я бы порекомендовал всем, кто еще не разбирался в LINQ, что им нужно некоторое время для изучения Linq-to-Objects, потому что это очень удобно в любое время, когда вы настроили логику для работы.

Мне не особо нравится специальный синтаксис LINQ, похожий на SQL. Я нахожу это немного раздражающим в середине кода C # - на мой взгляд, это конфликтует с методом объекта, вызывающим стиль синтаксиса. Я был бы счастливее с более распространенным синтаксисом понимания списка, который используется, например, в Python.

Существуют ли новые функции, которые нужны C #?

Мне бы очень хотелось иметь лучший синтаксис для быстрой инициализации массивов (или, может быть, IEnumerables?) И словарей. C # немного громоздкий в этом отношении - мне приходится печатать так много скобок. В связи с этим я очень скучаю по урожайности! (выдает каждый элемент в этой коллекции) синтаксис.

Я также хотел бы, чтобы C # позаимствовал улучшенный вывод типов F # и, возможно, его кортежи и множественные присваивания. Может быть, я должен просто пойти и использовать F #.

0 голосов
/ 23 сентября 2017

Я думаю, что проблема заключается в людях, которым просто нужно использовать новейший синтаксис для всего и везде. Они создают простую программу «Hello World», которая выглядит как взрыв на фабрике спагетти.

Представьте, что вы писатель и все время настаиваете на использовании самых сложных, запутанных, редко нужных или понятых слов.

Не многие люди будут читать ваши книги.

Тот факт, что язык позволяет некоторым людям создавать такой беспорядок, отталкивает других людей, потому что они должны выяснить, что, черт возьми, происходит. Мой опыт показывает, что люди, которые пишут такой код, не пишут код, который работает очень хорошо и нуждается в большом обслуживании. Я имею в виду, что они уже выбросили принцип KISS в мусорное ведро. ИМХО искусство или программирование делают сложные вещи простыми, а не наоборот. Такая ситуация может создать рынок для более простого языка, который делает все, что вам нужно, но только в читаемом человеческом синтаксисе.

0 голосов
/ 28 апреля 2009

Да, C # имеет много функций, но именно поэтому мы используем его! Любой, начинающий карьеру программиста, должен рассчитывать на карьеру, изучая / изучая новые вещи и сдавая экзамены! Как человек, который любит изучать новые вещи, вот почему мы любим его!

Лично я нахожу лямбда-выражения и методы расширения, например, чрезвычайно полезными. Для создания крупномасштабных распределенных приложений, в которых я хочу разделить данные и логику, я обнаружил, что LINQ не очень полезен. Но я с нетерпением жду возможности c # 4, такие как необязательные параметры.

Как упомянул @Alex, я думаю, что изучение того, как правильно использовать функции, является самым сложным аспектом. Хорра для тех из нас, кто был с C # с первых дней!

0 голосов
/ 28 апреля 2009

Мне тоже нравятся большинство новых функций, и, честно говоря, я бы не хотел терять методы расширения и linq в целом.

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

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

...