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

Этот момент A-Ha для понимания дизайна OO в С#

Я изучаю С# в течение нескольких лет, прочитывая простенько, даже принимая несколько курсов доступа к данным С# от Microsoft. Я также читал книги о ООП. Я кодирую приложение базы данных на базе Интернета. Хотя моя должность не является "программистом", мне посчастливилось работать над этим как побочным проектом. Я закодировал в Basic в начале 80-х и даже неплохо использовал pokes и peeks, чтобы манипулировать Apple] [+ и TRS-80, чтобы поразить и поразить моих друзей. Но это был очень линейный подход к кодированию.

Все это, как говорится, что-то просто не щелкает со мной. У меня не было этого момента a-ha с С# или OOP, который дает мне возможность сесть, открыть VS2008 и начать кодирование. Я должен изучить код других людей настолько, что просто кажется, что я ничего не делаю сам по себе. Я разочаровываюсь.

Не похоже, что я не способен на это. Я быстро взял t-sql. Кто-то может сказать мне, какую информацию они хотят получить из базы данных, и я могу закодировать tsql за несколько минут, чтобы дать им то, что они хотят. SQL - это то, что я получаю. Это не происходит для меня с ООП или С#. Конечно, С# по своей природе сложнее, но в какой-то момент он должен щелкнуть. Правильно?

Я читал о stackoverflow, и я ошеломлен тем, насколько вы бесконечно умны.

Что вы сделали для этого?

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

4b9b3361

Ответ 1

Изучение интерфейсов сделало это для меня. Исходя из фона сценариев и перехода на OO, я не видел, как создание всех этих классов было более эффективным. Затем я прочитал Head First Design Patterns, и вдруг я увидел, почему. Это не самая подробная книга, но это фантастический первый шаг к объяснению "почему" программирования OO, с чем я изо всех сил боролся.

Надеюсь, что это поможет.

Ответ 2

Большинство плакатов на SO не являются исключительно интеллектуальными. Есть несколько вещей, которые могут вас перепутать, чтобы думать, что это так. Во-первых, только люди, которые знают или думают, что они знают ответ, будут беспокоиться о том, чтобы ответить. Во-вторых, неправильные/плохие вопросы и ответы не видны. В-третьих, естественно, что коллективные знания будут намного больше, чем индивидуальные знания.

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

Крейг Ларман и Брюс Экколс и книги "Начинающий старт" отлично подходят для этой модели обучения. Однако я должен предупредить вас, что читать книги и делать упражнения недостаточно. Вы должны погрузиться в дискуссию и обратную связь с другими разработчиками (если, конечно, вы исключительно умный человек, и в этом случае вы просто получите его...).

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

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

Ответ 3

Введите код. Много. Плохой код, хороший код, бесполезный код - это не имеет значения. Просто напиши. Когда вам надоело писать код (и если вы не устали от этого, иногда вы недостаточно писали) читали блоги, журналы и книги о коде.

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

В какой-то момент вы начнете думать о С# - как и в SQL.

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

Ответ 4

Первый вопрос: сколько часов вы кодируете за неделю?

Второй вопрос: кто вы знаете в реальной жизни, кто его получает? Поговорите с ними!

...

Объектно-ориентированное программирование - это способ программирования, который организует и сводит к минимуму повторение себя. Это уменьшает количество кода и упрощает изменение кода (потому что все только на одном месте).

У вас возникли проблемы с этим, поэтому я могу предположить, что вы не пытаетесь наследовать необходимость наследования. Наследование - это способ уменьшить код повтора. И другая основная часть ООП - это классы. Точка классов состоит в том, чтобы группировать вещи так, чтобы они красиво организовывались, а также удерживали их в инкапсулированном состоянии для уменьшения связи (таким образом, облегчая изменение кода!)

Это почти все, что есть.

Теперь выходите и программируйте материал 24/7 и найдите любого в реальной жизни, который действительно понимает этот материал и отговаривает свое ухо.

Удачи.

Ответ 5

  • Первый шаг для меня: понимание циклов FOR в Turbo Pascal 5. Это навсегда изменило мою жизнь.
  • Второй шаг: понимайте, что каждый объект похож на кнопку (или любой другой элемент управления ui), как правило, невидимый.

Вам может быть интересно прочитать это:

Ужас кодирования: разделение программирования овец от не-программирующих козлов

Ответ 6

Я помню это чувство. Мне было поручено работать над приложением в ASP.NET и С#. Проблема в том, что я не был разработчиком С#, и Работодатель это знал! Но из-за того, что у меня был опыт программирования с ними, они побудили меня сделать это. Я был разработчиком PHP, вступая в мир .NET.

Первая неделя была разочаровывающей. Я помню, как рассердился, спрашивая, почему я не могу просто включить ( "sideNavigation.php" ), чтобы получить мою навигацию на странице. Вместо этого я должен сделать некоторый контроль, добавить его в какой-то другой элемент управления - это не имеет никакого смысла. Но я продолжал читать.

ASP.NET начал ловить, и разметка имела большой смысл. Когда я узнал о аспекте разметки, я начал становиться немного более знакомым в коде. Я знал, какие свойства и методы существуют для большего количества вещей и какие типы значений они принимают.

Конечно, места, такие как www.learnvisualstudio.net, тоже пригодились, с видео-руководствами на С# и VB.NET.

Сегодня я все еще разработчик PHP, но мне достаточно комфортно с .NET, что я могу вернуться в VS2008 и возиться до тех пор, пока не получу свое решение.

Все со временем, друг мой. Еще одна полезная вещь: найти пользовательскую группу .NET и регулярно посещать.

Ответ 7

Нет никаких реальных советов, которые я могу вам дать, потому что вы совершенно правы: он должен щелкнуть. ООП трудно объяснить, так что каждый получает его, так же как может быть трудно понять сообщения Windows, внешние первичные ключи и почти все другие темы, о которых стоит упомянуть.

Я бы предположил, что вы пытаетесь сделать настоящий проект самостоятельно. Он не должен быть сложным, но он должен включать несколько классов, поэтому вы можете получить свои руки грязными с наследованием и другими приятными вещами ООП.

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

Ответ 8

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

Конечно, некоторые из примеров в нем надуманны, как и многие другие книги по программированию, но эй, кто не хочет строить свои собственные космические захватчики?!

Ответ 9

Я согласен с Джереми МакКоллумом. Возможно, вам нужно остановить чтение и начать делать!

Хорошо, не прекращайте чтение, но в какой-то момент единственный способ стать лучшим программистом - это фактически работать с инструментом/языком, который вы пытаетесь изучить.

Мой сценарий очень похож на ваш. Хотя мой рабочий день есть программист, это не С# или даже .Net. То, как я потерял монету, - это фактически начать работу над реальным проектом. Это даже не большой проект, но это настоящий проект, где мне нужно было научиться делать некоторые вещи, которые я никогда не делал (на С#).

Сделайте то, что вы сказали, что не можете: сядьте, откройте VS2008 и начните кодирование. Просто сделай это!

Подходите к нему, как к реальной работе, без проводов! От этого зависит ваше занятие. Для меня это действительно так, так как я хочу получить задание на С# в какой-то момент в будущем. Если я не могу завершить проекты, это никогда не произойдет.

Ответ 10

Мой "click" не произошел непосредственно в связи с С#, но было три экземпляра, которые, я считаю, связаны с моей способностью легко работать в С#.

1) Мне было 8 лет, пытаясь написать простую процедуру сборки, чтобы очистить графический экран на Commodore 64. В тот момент, когда я бы написал цикл в Basic, я ударил стену. Насколько я понял, не было никакого способа написать цикл на языке ассемблера, который пересекал 256 (однобайтовый) барьер. Я охотился за книгами, которые у меня были, и просто не мог найти решение. (Ответ наверняка заключался в том, чтобы не писать 3-байтную "строку" кода для каждой группы из 256 строк пикселей.) Несколько дней спустя это просто ударило меня. (Решением было написать две петли, причем внешний цикл фактически менял код внутреннего цикла.) Это не то, что нам нужно делать с нашими текущими языками, но я почти мог чувствовать, что мой мозг растет.

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

3) В колледже, и после того, как я несколько лет программировал для развлечения, мой инструктор предоставил нам назначение ООП начального уровня. Мы должны были использовать объект, содержащий несколько других объектов. Каждый из них выходил на экран. Чтобы выполнить задачу, все должно было вращаться на 45 градусов. Почти все студенты (включая меня) получили частичный кредит, потому что мы вращали каждый объект внутри содержащего объекта. Те, кто получил полный кредит, просто повернули одну вещь: содержащий объект. Я не слышал "click", но этот урок определенно помог мне понять ООП.

Чтобы нарушить свой собственный барьер, вы могли бы следовать приведенным выше предложениям. Может быть, найти простой проект, который вы четко понимаете, и реализовать его на С#. Или вы можете взять физический объект, который вы понимаете достаточно хорошо (например, автомобиль с рулевым колесом, колесами, двигателем, тормозами и т.д.) И моделировать его с помощью классов на С#. Конечно, вы также можете достичь "click", просто выбрав одну функцию или ключевое слово, чью цель вы не получите, и изучите это, пока не нажмете. Этого одного щелчка может быть достаточно, чтобы полностью проникнуть в С#.

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

Ответ 11

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

Первый объект, который я написал, в котором я действительно его получил, был небольшим классом, который создал соединение с базой данных, и инкапсулировал кучу методов для выполнения SQL-запросов. После этого момента ООП перешел от того, о чем говорили учителя, в то, что было действительно полезным для меня и моего кода.

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

Как сказал кто-то другой, возможно, немного отбросьте С# и попробуйте другой язык. Расширьте свои горизонты, возможно, изучите некоторые С++ или повесьте с Python или Ruby. Вы вернетесь на С# со свежей перспективой и прозрачной палитрой, а также как лучший программист, и, возможно, теперь вы станете более привлекательными для вас.

Ответ 12

Попробуйте следующее: найти большой оператор switch и реорганизовать его в классы. Это был большой ага! момент для меня. Это классический рефакторинг, иллюстрирующий разницу между процедурным и OO-дизайном, и его нетрудно выполнить. Тогда поймите, что если инструкции являются небольшими переключателями.

Теперь перейдите и прочитайте шаблоны проектирования. Напишите некоторые классы, используя их.

Затем возьмите некоторый набор классов, которые предоставляют некоторую функциональность и переписывают его без операторов возврата и предпочтительно с интерфейсами. Это был еще один большой ага! для меня.

На самом деле хорошая ставка - потратить неделю на чтение c2.com.

Надежда помогает вам в вашем путешествии.

Ответ 13

Не знаю... Для меня это был Turbo Pascal 6, который представил концепцию ООП, но я не совсем понял это. Затем я изучил С++, и все сразу стало кристально чистым. Исходя из С++, С# просто кажется очень простым, поэтому я не мог сказать, что у меня был момент a-ha с С# или .NET.

Думаю, вам просто нужно написать код. Много кода.

Ответ 14

Я могу полностью сочувствовать. У меня есть степени на английском и кино; единственное программирование, которое я сделал до того, как мои последние двадцатые годы были применены] [e, когда мне было 12 лет. Классический ASP был моим первым набегом на веб-программирование, которое я узнал только потому, что должен был стать техническим писателем, работающим над интранет-проект, документирующий программное обеспечение для недвижимости.

Но в конечном итоге программирование заняло место, и я решил начать изучать, как все правильно. Переход был непростым. Но я могу сказать, что обучение С# для веб-разработки, особенно если вы уже не являетесь своего рода "grok" OO, может быть сложным - главным образом потому, что OO так много хочет создавать и управлять состоянием и состоянием, а Web по своей сути является апатридом.

Верьте или нет, я узнал больше о OO, пишущем приложения Ajax с приложениями JavaScript и Flex в ActionScript, т.е. созданием клиентов с поддержкой состояния, - чем я когда-либо пытался заставить С# в свой мозг, потому что приложения Ajax и приложения Flex заставляют вас думать о вещах с точки зрения состояния. Вернувшись на С#, проведя пару лет (да, через пару лет), написав много кода JavaScript, а также много кода Flex и прочитав много лотов и т.д., На самом деле было довольно легко, потому что к тому времени я понял, как С# должен работать как язык OO.

Книга "Голова первая серия" тоже велика - люди вроде бы преуменьшают их здесь, потому что они довольно глупы, но они учат отличным концепциям, и я был удивлен, насколько хорошо их уроки остались со мной года. Попробуйте название OO. И потратьте некоторое время на работу с JavaScript. Возможно, посмотрите на работу Дугласа Крокфорда. Он щелкнет. Просто дайте ему время.

Ответ 15

Отключить тему, знаете ли вы, где у вас есть эта фраза, "момент a-ha": это из книги, от кого-то еще или оригинала? Потому что я думаю, что я помню кого-то, кто использовал ту же самую фразу, когда я изучал ООП и C++, в Интернете примерно в 1994 году.

В любом случае: ваш вопрос.

Как и ваш, мой опыт программирования предшествует ООП: я тоже сделал базовое программирование и, C.

В некотором смысле, как вы сказали, "очень линейный подход к кодированию".

Я профессионально программировал на C, когда начал изучать С++. Поэтому, имея возможность "садиться, открывать VS2008 и начинать кодирование", я как бы уже делал это каждый день: я сидел и кодировал в C.

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

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

Так что еще одна вещь: если вы можете сделать это вообще, тогда вы делаете что-то правильно. Не ожидайте, что все будет всегда легко. Хорошее решение может сделать решение более легким и очевидным, но разработка хороших решений для больших трудных задач непростая, и мы можем поблагодарить ООП за то, что вы сделали это вообще.

В любом случае, вернемся к моей истории: я был кодированием в C. Я учился постепенно использовать С++, например:

  • У меня есть куча данных (структур) и множество функций, которые работают с этими данными... ставят функции в те же структуры, что и данные, на которых они работают, а "функции" становятся "методами"
  • Теперь, когда данные имеют связанные методы, которые должны воздействовать на эти данные, сделайте данные конфиденциальными, чтобы другие методы не могли коснуться его напрямую... инкапсуляция и/или скрытие информации
  • Теперь, когда у меня есть четко определенные классы (некоторые из которых уже содержат друг друга в качестве элементов данных), начните использовать наследование для реализации сходств и различий между различными типами.

Для меня одним из моментов "а-ха" было то, что мы водили водителей для разных факсимильных аппаратов, каждый из которых имел разные API низкого уровня. Используя ООП, мы могли бы написать...

  • Простой, абстрактный класс, который объявил простой API высокого уровня (например, sendFax, receiveFax, cancel и т.д.), который мы хотели, чтобы все устройства поддерживали
  • Подклассы, которые использовали API конкретного оборудования для реализации абстрактного API, унаследованного от абстрактного базового класса.

Я только что вспомнил что-то еще. Когда я изучал С++, я читал разные книги:

  • Думая на С++, чтобы научиться читать синтаксис С++
  • Эффективный С++ для изучения различных канонических тактических ошибок, которые следует избегать при написании С++

Прочитав их и примерно с 6-месячной практикой, я мог бы использовать С++ как лучший C.

Одна из следующих книг, которые я прочитал, была "Дизайн-паттерны" Банды Четыре: и чтение этой книги было для меня "а-ха", это заставило меня подумать: "Если бы эти другие книги показали мне как писать на объектно-ориентированном языке программирования, эта книга показывает мне , почему я бы хотел."

Итак, есть рекомендация: прочитайте образцы дизайна.

Я говорил о С++ и т.д., потому что это была эпоха, в которой у меня была первая а-а. Я думаю, что это релевантно... зная OOP и С++, мне потребовалось меньше недели, чтобы "сесть, открыть VS2008 и начать кодирование" на С#, когда это произошло.

Ответ 16

  • Вам нужно что-то, что вам нужно/нужно выполнить.
  • Сядьте и создайте его.
  • Пока вы его создаете, вам придется выяснить, что вы не знаете. Вероятно, это лучший способ определить, что это за вещи.
  • Когда вы закончите и что-то работаете, оглянитесь назад и подумайте о том, что вы могли бы сделать по-другому, чтобы лучше организовать его.
  • Проведите некоторое исследование об этих конкретных вещах и возможных способах его подхода.
  • Создайте что-нибудь еще и подумайте над этим.
  • Повторяйте, пока не получите момент a-ha.

Для меня мой первый момент а-ха был обучен ассемблеру Honeywell во время моей третьей недели обучения и, наконец, понял, как действительно работает компьютер.

Мой момент OOP OOP был во время курса логики релейной логики в режиме реального времени, и я решил создать библиотеку для моделирования аппаратных средств Texas Instruments, с которыми нам пришлось писать наши программы. Это позволило мне написать/протестировать мои программы для класса без необходимости ходить в школу и использовать реальное оборудование. Он открыл глаза ООП. Я считаю, что момент a-ha произошел, потому что я смог смоделировать (с кодом) что-то реальное.

Ответ 17

Ну, вот как я вижу твою проблему. Тот факт, что вы пришли из SQL, 4GL (язык четвертого поколения), который ближе к человеческому языку, чем 3GL, такой как С#, похож на то, что кто-то использует для вождения самолёта, не получает то, что нужно для вождения автомобиля. Вы должны либо попытаться научиться велосипеду (2GL, как язык ассемблера), либо попытаться управлять автомобилем нижнего конца (например, Fortan или C), чтобы оценить язык, такой как С#.

Ответ 18

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

Кроме того, я обнаружил, что дядя Боб полезен как ученик, так и преподаватель, в частности некоторые из принципов проектирования оо: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Ответ 19

Изучение того, что Дженерики в С# сделали это для меня. Теперь я навсегда думаю в выражениях if-else.

Ответ 20

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

OO, с другой стороны, касается поведения. задача программирования в OO-системе связана с вызовом поведения в соответствующих экземплярах для выполнения поставленной задачи и для разработки классов объектов, которые будут вести себя ожидаемыми способами.

Ответ 21

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

Ответ 22

Первыми шагами на любом языке должен быть учебник "Hello World". Магия этого метода обучения, также называемая обучением, заключается в том, что он сразу же становится основной мотивацией обучения.  Я сам являюсь разработчиком С#.NET, и сейчас я изо всех сил пытаюсь изучить F #. Шаги, которые я должен предпринять после написания моего HelloWorldApp, устанавливают небольшие и легкие цели, такие как

Записать консольное приложение, которое загружает некоторую страницу в сети и отображает ее содержимое HTML.
Сделайте это снова, но теперь асинхронно.
Сделайте это снова, но теперь несколько страниц параллельно.

и т.д.

Вот как я чему-то научился. Для ООП ситуация становится немного сложнее, вы должны также читать код и статьи других людей. Одна вещь, которая помогает вам разогнать OOP и рефакторинг самостоятельно, - это повторное использование вашего собственного кода. В моем примере выше вы заметите, что код, написанный для загрузки страницы синхронно, очень похож на тот, который использовался для асинхронности, у них есть даже несколько строк, которые на 100% равны. Что вы должны сделать, чтобы изучить ООП, это рефакторинг и инкапсулировать ваш код, чтобы вы могли выбрать нужный тип загрузки (синхронизация или асинхронный) с минимальным повторением в коде, написанном для обоих вариантов. Если вы используете TDD (Test Driven Development), кривая обучения улучшится.

Ответ 23

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

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

Просто мое мнение основано на моем собственном опыте...

Ответ 24

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

Мой коллега любит цитировать выражение одного из его профессоров в колледже, которое пошло примерно так:

Запишите сетку с строками, помеченными типами данных, и столбцами, помеченными операциями над данными. Если вы разрезаете свою реализацию по горизонтали, вы делаете объектно-ориентированное программирование. Если вы разрезаете его по вертикали, вы выполняете функциональное программирование.

Попробуйте подумать об OO как способе организации кода, в котором реализация операции по определенному программистом типу данных связана с определением данных.

Ответ 25

Объектно-ориентированный дизайн в целом требует умственного прижимания, но для меня O-образный O-образ был довольно естественным после того, как университет использовал JAVA для обучения OOD.

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

Ответ 26

Здесь есть много хороших предложений, хотя только г-н Сэмпсон намекнул, что было бы полезно найти правильных людей для ответа на вопросы. Я не могу подсчитать, сколько раз я смотрел, как кто-то работает, прервал их, чтобы задать вопрос так: "Почему вы сделали X?" и вскоре после этого будет иметь момент a-ha. Не всегда, но задавайте достаточно людей достаточно вопросов, и ум-meld произойдет, и это здорово, когда это произойдет.

Ответ 27

Мой "а-ха" момент о ООП пришел из работы с .NET framework. Сначала меня раздражало то, как неудобно было писать текст в файл. Затем я понял, что мне не нужно принимать решение о том, будет ли мой объект печатать в файл; Я мог бы просто использовать TextWriter, и пусть все, что создавало его, решает, куда будет выводиться выход в файл или на консоль. Затем я понял, насколько легко сделать подкласс TextWriter, который отправил вывод в TextBox. И затем я понял, что такое мышление лежит в основе всего дизайна рамки.

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

Ответ 28

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

То, с чем у меня возникают проблемы, - это выяснить, какой класс должен делать то, что, например. должен ли объект-сотрудник иметь метод RaiseSalary, который принимает сумму, или если у объекта PayMaster есть метод, который принимает список сотрудников и рассчитывает, сколько нужно повысить их оплату? Тонкий пример, который я знаю, но это пример: P

Ответ 29

Интерфейсы. Я понял основы ООП и наследования, когда я впервые начал использовать, но интерфейсы заняли неоправданно долгое время для понимания.

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

Итак, однажды я сказал себе: "Интересно, как вы пишете методы, которые обобщаются по всем типам, которые имеют конкретный метод, без необходимости жертвовать безопасностью типа". Тогда мне пришло в голову: именно то, для чего используются интерфейсы! Как только я понял это, все имело смысл, и сам я придумал несколько шаблонов проектирования, которые были очень похожи на factory и шаблоны наблюдателей.

Что, когда он щелкнул со мной, и я смог думать о ООП на совершенно другом уровне.

Ответ 30

То, что сделало OO для меня, - это узнать о OOT, основанном на Prototype, как в Io и Self. С# OO - совсем другой зверь: не элегантный и простой, но волосатый и сложный. Простой не означает менее мощный, наоборот! Сначала я предлагаю сначала простую и элегантную систему. Затем вы можете увидеть OO в С#, если вы косо.

Еще один момент A-Ha заключался в понимании того, как система типов может предотвратить вызов неправильных методов на неправильных объектах во время компиляции. Система типов С# не делает этого во всех случаях из-за бросков. Я получил этот момент A-Ha, когда читал статьи в теория типов из журнала Object Technology.