От процедурной функции к классу ООП (одна конкретная ситуация) - PullRequest
2 голосов
/ 03 марта 2011

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

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

Итак, могу ли я увидеть "способ оплаты" как класс?

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

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

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

Различный класс для каждого метода оплаты или большой класс со всеми из них ...

На самом деле я не вижу парадигмы ... но я почти уверен, что она есть :-)

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

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

Итак, могу ли я увидеть "способ оплаты" как класс?

В чистом ООП все является классом или методом. Класс «Способ оплаты» имеет смысл, тем более что существуют различные способы оплаты.

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

Способы оплаты сводятся к их основным составляющим и поведению. Задайте себе такие вопросы, как: действительно ли денежные суммы являются частью того, как кто-то платит, или они являются частью того, что им платят? (Ответ на этот конкретный вопрос: они являются частью платежа, а не методом платежа) Когда платеж выполнен, информация о платеже будет необходима, но она может быть передана любым необходимым методам (возможно, в объекте платежа, который представляет денежная сумма, отправляемая от покупателя продавцу, или в объекте Order, или в объекте Order, может реализовывать интерфейс Payment, хотя последний не будет моделировать реальный мир инъективно ).

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

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

Существует несколько допустимых подходов к использованию объекта метода оплаты. Каждый раз, когда действие включает в себя несколько объектов, и один не является явным субъектом (то есть тем, который должен выполнять действие), вы можете использовать свободную функцию (то есть функцию, не являющуюся методом), которая вызывает необходимый методы соответствующих объектов. Если поведение функции меняется в зависимости от типов времени выполнения нескольких объектов, вы бы использовали multi-method (если это возможно; не многие языки изначально поддерживают multi-методы, хотя вы можете моделировать его во многих языки с определенными шаблонами, такими как двойная отправка ). Другие возможности включают в себя наличие контроллера в качестве основного участника.

Одной из концепций, которые могут помочь при реализации проектов, являются правила доступа , явные в программировании возможностей: объекты могут обращаться к другим объектам, которые они создают, создаются с осознанием (то есть передаются их конструктору) или вводятся в , Эти правила информируют такие методы, как внедрение зависимостей, Model-View-Controller (MVC) и т. Д.

Различный класс для каждого метода оплаты или большой класс со всеми из них ...

Где-то посередине. Все, что является общим для всех способов оплаты (например, URL-адрес действия), должно входить в базовый класс. Если метод оплаты должен переопределить обычное поведение или требуется поле, которого нет у других методов, создайте подкласс базового метода оплаты. Ради согласованности вы можете расширить базовый класс для всех способов оплаты, хотя некоторые подклассы могут ничего не перекрывать.

1 голос
/ 05 марта 2011

Исходя из того, что вы описываете, архитектура ООП, которая, я думаю, подойдет, будет выглядеть следующим образом

  • ShoppingCart - хранит покупки и рассчитывает общую стоимость / возврат / налог / т. Д.
  • Покупка - хранит то, что покупается, и стоимость.
  • PaymentMethod - интерфейс для способов оплаты, который принимает корзину покупок и принимает покупки.
  • PayPalPaymentMethod - производный класс PaymentMethod, который оплачивает покупки через сервис PayPal.
  • CreditCardPaymentMethod - производный класс PaymentMethod, который оплачивает покупки с помощью кредитной карты.

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

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

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

...