Необъектно-ориентированное программирование на объектно-ориентированном языке [закрыто]


15

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

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

PS: я не прошу здесь рассказать мне о преимуществах объектно-ориентированного программирования по сравнению с процедурным программированием.


12
Нет абсолютно никаких причин избегать применения различных техник по мере необходимости. Вам, как программисту, нужно будет взвесить все за и против в каждом конкретном случае. Довольно часто все сводится к личному стилю.
ChaosPandion

3
У меня никогда не было проблемы. Язык почти всегда был предписанным инструментом, учитывая команду и / или другую архитектуру.


8
Реализация одной и той же программы с использованием ОО-методов и без них является хорошим упражнением для изучения чего-либо, я не могу понять, почему некоторые люди здесь, кажется, отрицают это или опровергают вас. Но проблема с вашим вопросом в том, что он уже задавался здесь не раз, в разных формах. И хотя вы это отрицаете, вы будете спрашивать о достоинствах объектно - ориентированном программирования над процедурным программированием. И C ++ не является ОО-языком, это гибридный язык.
Док Браун

3
Добавьте функцию, которая отображает введенную вами формулу, а затем добавьте функцию квадратного корня (сначала не делайте этого, это будет обманом.) И дайте нам знать, что вы думаете.
JeffO

Ответы:


25

C ++ - это не просто язык ОО, это мультипарадигмальный язык. Таким образом, он позволяет вам принимать решение за или против ОО-программирования или смешивать их оба. Использование ОО-методов добавляет больше структуры вашей программе - от чего вы выиграете, когда ваша программа достигнет определенного размера или сложности. Эта дополнительная структура, однако, предоставляется по цене дополнительных строк кода. Поэтому для «небольших» программ лучше всего сначала реализовать их в не-ОО стиле, а потом добавлять все больше и больше ОО-методов, когда программа начнет расти с годами (что, вероятно, не произойдет). «Программы, но это типичный жизненный цикл для многих деловых программ).

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


Если простые программы «упражнений» начинают развиваться, лучший способ - реализовать их таким образом, чтобы впоследствии их можно было пересмотреть. Спасибо, что поделились этим :) +1
FaizanRabbani

@CarlSmith: абсолютно. Но когда я написал свой ответ, я попытался сосредоточиться на точках и масштабе реального вопроса.
Док Браун

10

Как профессиональные программисты выносят суждение о том, идти ли на ООП или нет? Это было бы очень полезно для меня.

Для меня есть два решения. Во-первых, иногда это будет очевидно в начале. Будет много похожих типов, которые имеют общие методы, которые сильно различаются по деталям реализации. Например, я строил систему документооборота, и мне нужна была возможность выполнять произвольные задачи. Чтобы выполнить задачу, я реализовал базовый класс, от которого унаследована каждая задача, с помощью Execute()абстрактного метода. Унаследованные классы обеспечивали реализацию, но система рабочего процесса могла начать выполнение, не зная ничего о том, какую задачу выполняли.

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

Большая часть перехода к объектно-ориентированному стилю в противоположность функциональному стилю заключается в преобразовании операторов if-then в операторы «run this action». Вместо огромного набора операторов if-then вы просто указываете коду выполнить его действие. Какое действие на самом деле выполняется, зависит от реализации, которую вы предоставили.

Например, вот функциональный стиль в псевдокоде в стиле C #:

if ( action == "email" ) { 
    callEmailFunction(userInfo);
}
else if ( action == "sms" ) { 
    callSmsFunction(userInfo);
}
else if ( action == "web" ) { 
    endpoint = "http://127.0.0.1/confirm";
    confirmWeb(endpoint, userinfo);
} 
...

Но, возможно, вы могли бы переписать это примерно так:

interface IConfirmable {
    void Confirm(UserInfo userinfo);
}

public class ConfirmEmail : IConfirmable { 
    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via email
    }
}

public class ConfirmSms : IConfirmable { 
    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via email
    }
}

public class ConfirmWeb : IConfirmable { 
    // this is a constructor
    public ConfirmWeb(string endpoint) { 
        ...
    }

    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via web
    }
} 

А потом сам код:

// An implementation that decides which implementation of the base class to use
// This replaces the if-then statements in the functional programmming.
IConfirmable confirmer = ConfirmerFactory.GetConfirmer();

// get the userinfo however you get it, 
// which would be the same way you get it in the functional example.
UserInfo userinfo = ...;

// perform the action.
confirmer.Confirm(userinfo);

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

Но объектно-ориентированный стиль действительно сияет, когда у вас есть несколько действий, а не только Confirm()метод, который необходимо выполнить. Возможно, у вас есть подпрограмма инициализации, три или более методов действия, которые можно запустить, и Cleanup()метод. Базовый алгоритм идентичен, за исключением того, что он обращается к соответствующим объектам, которые реализуют общий базовый класс. Теперь вы начинаете видеть реальную выгоду для объектно-ориентированного стиля: базовый алгоритм гораздо легче читать, чем если бы он проверял операторы if-then на каждом этапе пути.


+1 за подробный анализ. :) У меня мало мыслей по этому поводу.
FaizanRabbani

1
В сторону: пожалуйста, прекратите публиковать комментарии "спасибо" на каждый ответ. Мы предпочитаем сосредоточиться только на вопросах и ответах, а не на обсуждении.
Филипп Кендалл

5
Этот пример является скорее обязательным, чем функциональным.
OrangeDog


1
Просто обратите внимание: когда вы склоняетесь к куче операторов if / else или switch, всегда есть возможность рассмотреть какую-то таблицу поиска. Итак, еще один способ переписать, который идет по принципу var dict = new Dictionary<string,Action<UserInfo>{ { "email", callEmailFunction }, { "sms", callSmsFunction } }; dict[ action ]( userInfo );(dict может быть статичным, обработка ошибок пропущена)
stijn

3

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


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

1
С каких это пор «не объектно-ориентированный» называется «старым стилем»?
DanielSank
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.