Как мне стать лучше в ООП? [закрыто]

27
задан Latze 23 August 2010 в 13:40
поделиться

12 ответов

Вероятно, вы используете объекты, даже не осознавая этого.

Если вы пишете Javascript, взаимодействующий с DOM, вы используете объекты.

Если вы используете какой-либо из фреймворков Javascript (jQuery, MooTools и т. д.), вы используете объекты.

Использование объектов будет полезно, когда вам нужно инкапсулировать некоторый часто используемый код, чтобы его можно было легко использовать повторно (в одном приложении или в нескольких приложениях, таких как подключаемые модули jQuery... которые сами по себе являются объектами).

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

10
ответ дан 28 November 2019 в 05:28
поделиться

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

Чтобы суммировать преимущества ООП, не написав здесь книгу, ООП в основном делает для вас три вещи:

  1. Группируйте связанные данные вместе. Программы без ООП часто имеют целую кучу переменных, плавающих вокруг основной программы, которые только слабо связаны между собой. В ООП вы помещаете связанные переменные в объект.

  2. Связывайте функции с данными. Помещая функции в объект вместе с данными, над которыми они работают (пуристы скажут, что тогда это будут "члены", а не "функции"), вы даете читателю понять, что они идут вместе.

Комбинация #1 и #2 позволяет вам скрыть детали реализации от других объектов. Вы создаете "публичный интерфейс" для класса, набор функций, которые должны вызывать другие объекты и которые представляют логические вещи, которые делает этот класс, а затем любые другие функции, которые вам нужны, могут быть скрыты. (В некоторых языках это выражено более явно, чем в других, но речь не об этом).

  1. Классы могут наследоваться и изменяться. Если у вас есть два похожих класса A и B, которые должны быть в основном одинаковыми, но с небольшими различиями, вы можете создать суперкласс C со всеми общими вещами, а затем A и B наследуют от него и каждый добавляет свои собственные уникальные вещи. Это то, что обычно рекламируется как сила ООП. Честно говоря, да, это очень круто, и в некоторых ситуациях может быть очень удобным, но я использую его истинную силу только время от времени, и я подозреваю, что то же самое верно для большинства программистов. (Энтузиасты ООП не стесняйтесь вступать, рассказывая, как и почему вы постоянно используете наследование.)

Когда использовать ООП? Каждый раз, когда у вас есть несколько частей данных, которые логически связаны друг с другом, имеет смысл создать класс для их хранения. Например, координаты X и Y; или имя, адрес и почтовый индекс клиента; или дальность действия бластера и потребляемая мощность бластера; или что-то еще.

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

Как и когда использовать наследование - более сложный вопрос. Я оставлю это для другого раза.

9
ответ дан 28 November 2019 в 05:28
поделиться

Подумайте, как можно использовать объекты для организации и упрощения приложения. Я нашел полезными две метафоры:

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

  • Рабочая группа состоит из нескольких человек, каждый из которых выполняет определенную работу. Люди общаются друг с другом при выполнении своей работы, и рабочие места делятся на две линии: те, которые выполняют задачи (рабочие), и те, которые организуют и направляют работу других людей (менеджеры).

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

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

Если вы сделаете это, вы опередите 80% всех программистов. Вам будет намного проще разрабатывать и поддерживать даже большие приложения, потому что вы сможете разбить сложные проблемы на простые компоненты.

3
ответ дан 28 November 2019 в 05:28
поделиться

Javascript - ужасный язык для изучения ООП. I рекомендовал бы изучить ООП на другом языке (например, Java или C ++), а затем изучить объектно-ориентированный синтаксис в Javascript. В этот момент у вас есть все ингредиенты.

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

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

2
ответ дан 28 November 2019 в 05:28
поделиться

На мой взгляд, лучше думать об ООП в контексте конкретной предметной области или бизнес-проблемы. Например, JavaScript использует объекты для моделирования поведения и атрибутов браузера, например Window, Frame, History ...

Модель предметной области бизнес-задачи будет содержать объекты, которые будут отражены в программном коде. написано ООП. Например, приложение для студентов университета будет содержать объекты для студентов, профессоров, курсов, учебных программ, комнат и так далее. Следовательно, начните со своей бизнес-проблемы и смоделируйте предметную область. В вашем коде ООП должны быть объекты, смоделированные из вашего домена. alt text

Источник: http://csci.csusb.edu/dick/samples/uml0.html

1
ответ дан 28 November 2019 в 05:28
поделиться

Вас могут заинтересовать паттерны проектирования (Книга, Википедия), которые рассказывают, как решать общие проблемы с помощью ООП. Многие классические паттерны проектирования могут быть не столь актуальны для JavaScript, поскольку в JavaScript есть другие элементы, не относящиеся к ООП (например, функции), которые могут решить некоторые проблемы еще более элегантно.

Некоторые простые паттерны проектирования, с которых я могу порекомендовать начать:

  • Абстрактная фабрика: Отложите инстанцирование объектов. В JavaScript в большинстве случаев с этой задачей справится функция.
  • Декоратор: Прозрачно добавлять функциональность к объекту во время выполнения. Также может быть вложенным. Пример использования: Логирование
  • Композит: Рассматривать дерево/граф объектов как один объект.
1
ответ дан 28 November 2019 в 05:28
поделиться

Я думаю, что использование классов в целом и принципов ООП делает ваш код более аккуратным, читаемым и делает вас более продуктивным.

1
ответ дан 28 November 2019 в 05:28
поделиться

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

Одним из преимуществ Javascript является то, что он поддерживает множество разных стилей; ООП, императивное и функциональное.

Одним из недостатков использования Javascript является то, что, поскольку он поддерживает множество различных стилей, трудно выучить другой стиль, по крайней мере, до тех пор, пока вас не заставит «а-ха» что-то еще.

Здесь полезно потратить время на языки, которые больше склонны принуждать вас к ООП (даже если некоторые утверждают, что не должны). C # и Java навязывают единое направление ООП, а C ++ - нет (с той же силой и слабостью, что и Javascript).

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

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

8
ответ дан 28 November 2019 в 05:28
поделиться

Джастин Нисснер сказал это, и я могу только добавить к его ответу ...

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

1
ответ дан 28 November 2019 в 05:28
поделиться

Javascript много , гораздо менее объектно-ориентированный, чем C # или Java; не волнуйтесь, если ваш Javascript не выглядит объектно-ориентированным.

-1
ответ дан 28 November 2019 в 05:28
поделиться

Недавно я работал над веб-приложением, для которого требовался бы тяжелый Javascript на стороне клиента.

Исходя из опыта работы с C # / Java, я понял, что Javascript потребует изменения мышления, однако я по-прежнему хотел по возможности применять хорошие принципы объектно-ориентированного программирования, в частности, для управления вероятной сложностью приложения.

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

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

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

1
ответ дан 28 November 2019 в 05:28
поделиться

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

function BlogPost(id,title,content)
{
    this.id = id;
    this.title = title;
    this.content = content;

    function display()
    {
        var post = $('<div class="blogpost"></div>');
        $(post).append('<h2>' + this.title + '</h2>');
        $(post).append('<p>' + this.content + '</p>');
        var deleteButton = $('<span class="deletePost">delete</span>')
        $(post).append(deleteButton);
        $(deleteButton).click(this.delete)

        $('#postcontainer').append(post);
    }


    function delete()
    {
        $.post('some/xhr/handeler',{id:this.id});
    }
}

Это быстрый (непроверенный) класс, который можно использовать для динамического добавления постов блога в div с идентификатором postcontainer и обработки щелчков по кнопке удаления.

3
ответ дан 28 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: