2009-06-18 2 views
1

У меня есть веб-приложение, закодированное в ABAP/BSP. Мне интересно доставить прекрасный код, поэтому, возможно, вы можете помочь мне распознать хороший или плохой шаблон. На самом деле я делаю следующее. Объявите объект базового класса и динамически создайте его на основе некоторого параметра с подклассом. У базового класса есть некоторые методы для извлечения данных() под-классы используют эти данные и, возможно, манипулируют им.Вы видите какие-либо (анти) узоры в моем дизайне? Как распознать шаблон?

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

alt text http://img35.imageshack.us/img35/4351/designkdp.jpg

ли Somthing как этот ОК? Есть ли какой-либо известный шаблон скрытый или я должен рефакторировать и использовать шаблон? Мне нравятся некоторые предложения. Я уже прочитал статью в Википедии, но я не вижу точно такой образ. (Также заказал несколько книг, но вы, ребята уверены, что быстрее :))

ответ

3

Кажется factory method

+0

Благодарим вас после прочтения статьи снова. Я думаю, что вы правы. Мое мнение основано на этой части (http: //en.wikipedia.org/wiki/Factory_method_pattern): public class ImageReaderFactory { public static ImageReader getImageReader (InputStream is) { int imageType = figureOutImageType (is); переключатель (изображениеType) { кейс изображениеReaderFactory.GIF: возвращение новый GifReader (есть); кейс ImageReaderFactory.JPEG: возврат новый JpegReader (есть); // и т. Д. } } } – Richard

1

Это шаблон фабрики из книги «Design Patterns: Элементы Многоразовые объектно-ориентированного программного обеспечения» от Gamma, Helm , Джонсон и Влиссидес.

+0

Благодарим вас за ответ. Я проверю книгу. – Richard

1

BaseClass и подклассы, мне кажется, как имеющее что-то как (псевдокод)

interface IDataProvider{ 
    GetData(); 
} 

class SubClass1 implements IDataProvider{ 
    GetData(){ 
    ... 
    } 
} 

Стратегия конкретизации вы используете, кажется, работает как Factory. Что вы можете сделать - это сделать рендеринг в каком-нибудь HTMLRenderingEngine или что-то еще (я не знаком с ABAP/BSP), просто чтобы разделить презентацию от остальной части логики.

+0

Спасибо за ваш твитп. К сожалению, я не могу использовать подход MVC из-за некоторых требований. Но я применил некоторые методы рендеринга html для разделения данных и построения html. – Richard

+0

MVC будет лучше, но вы также можете просто создать отдельный класс HTMLRenderer (назовите его как хотите). Это наследуется от интерфейса IHTMLRenderer, который предоставляет метод GetRenderedHTML(). Таким образом, ваш базовый класс содержит только зависимость от интерфейса, и вы все равно можете изменить свой рендер или даже подключить разные средства визуализации. Вы понимаете мою идею? Это делает его более удобным, чем просто отдельный метод в том же классе. – Juri

0

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

Что делать, если у вас был «DataClass», в котором вы могли бы установить processData объект (или нет). Объект processData фактически будет интерфейсом с единственным методом «processData».

При вызове GetData, это может выглядеть примерно так:

if(processDataObject == null) 
    return getInformation(); 
else 
    return processDataObject.processData(getInformation()); 

Heck, если у вас есть «Сквозной» объект ProcessData определил, что ничего не делает, и использовать его в качестве значения по умолчанию «processDataObject», то весь метод GetData становится:

return processDataObject.processData(getInformation()); 

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

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

+0

Mhh вы имеете в виду, что у меня будет несколько классов processData, которые реализуют интерфейс и имеют custome-кодирование. И есть DataClass, который реализует Data Data Objekt, который я могу динамически инактивировать в значительной степени так же, как сейчас? – Richard

 Смежные вопросы

  • Нет связанных вопросов^_^