Объявление и реализация членов функции класса C # - PullRequest
5 голосов
/ 10 октября 2009

Есть ли в C # понятие определения и реализации класса, подобное тому, что вы найдете в C ++?

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

Однако в C # кажется, что я вынужден определять свои функции-члены в точке объявления. Можно ли этого избежать или как-то обойти?

Во время моего обучения на C #, это один аспект, который беспокоит меня. Классы, особенно сложные, становятся все труднее читать.

Ответы [ 12 ]

7 голосов
/ 10 октября 2009

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

C # - это не C ++, если вы попытаетесь сделать это так, то вы запутаетесь, и никто другой не сможет прочитать ваш код.

День, потраченный на изучение использования инструментов Visual Studio, многократно окупит инвестиции с точки зрения производительности, и вы скоро удивитесь, как вы когда-либо жили с этим способом C ++.

Обновление в ответ на комментарии

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

Тем не менее, умная IDE не оправдывает плохой стиль. Существуют лучшие практики написания «чистого кода», для которых не требуется интеллектуальная среда IDE. Один из принципов чистого кода - сохранить определение чего-либо близким к его использованию, и я думаю, что это может быть расширено, чтобы охватить объявление и определение. Лично я считаю, что разделение объявления и определения делает код менее понятным. Если вы обнаружите, что получаете классы монстров, которые трудно понять, это может быть признаком того, что вы нарушаете принцип единой ответственности.

Причина отдельного определения и объявления в C / C ++ заключается в том, что C ++ использует однопроходный компилятор, где прямые ссылки не могут быть разрешены позже, в отличие от C # и его двухпроходного компилятора , который может с радостью находить ссылки независимо от порядка декларации. Это различие проистекает из различных принципов проектирования компиляторов: C / C ++ рассматривает каждый исходный файл как единицу компиляции, тогда как в C # весь проект считается единицей компиляции. Я полагаю, что когда вы привыкли работать в C / C ++, разделение объявления и определения может показаться желательным элементом стиля, но я лично считаю, что сохранение декларации и использования (или в этом случае объявления и определения) улучшает, Скорее, это снижает читабельность. Раньше я сам работал программистом на C, пока не начал использовать C # в 2001 году. Я всегда любил C и думал, что это способ сделать что-то вроде «колени пчелы». В наши дни, когда я читаю код C / C ++, я думаю, что он выглядит абсолютно ужасно, и я не могу поверить, что мы привыкли мириться с такой работой. Полагаю, все зависит от того, к чему вы привыкли.

7 голосов
/ 10 октября 2009

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

7 голосов
/ 10 октября 2009

Если вы используете Visual Studio, вы можете воспользоваться Class View. Вы также можете использовать функции раскрытия / свертывания редактора исходного кода.

В невероятном случае, когда ваши инструменты не помогают, вы всегда можете написать быструю утилиту, которая подытожит вам класс.

Если класс был скомпилирован, вы также можете использовать Reflector для просмотра класса.

4 голосов
/ 10 октября 2009

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

3 голосов
/ 10 октября 2009

Похоже, вы имеете в виду интерфейсы . В c # вы можете определить все свои функции-члены в интерфейсе, а затем реализовать их в другом классе.

3 голосов
/ 10 октября 2009

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

3 голосов
/ 10 октября 2009

Определить интерфейс.

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

1 голос
/ 10 октября 2009

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

альтернативно, вы можете обойти эту «проблему», используя некоторые инструменты для проверки статического кода. Окно Resharper «File Structure» даст вам именно то, что вы хотите. Вы также можете использовать встроенный "Class View" из Visual Studio. но я предпочитаю первое.

1 голос
/ 10 октября 2009

Если вы обнаружите, что класс трудно читать или трудно понять, это часто является признаком того, что класс пытается сделать слишком много. Вместо того, чтобы пытаться дублировать разделение объявлений и определений в C ++, рассмотрите возможность рефакторинга проблемного класса на несколько классов, чтобы каждый класс имел меньшую ответственность.

0 голосов
/ 10 октября 2009

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

Если вы не хотите, чтобы каждый класс реализовывал определенную вещь, то, вероятно, лучше использовать интерфейсы (как говорят другие).

Но в качестве побочной мысли: если сами ваши классы становятся все более и более сложными по мере того, как вы пишете программу, возможно, это скорее проблема дизайна, чем проблема языка? Я думаю, что класс должен нести одну ответственность и не брать на себя все больше и больше обязанностей по мере роста программы, а число классов и то, как старые классы используются, должны расти и усложняться по мере того, как вы продолжаете разрабатывать свое программное обеспечение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...