Вопрос о дизайне: поведение в разных контекстах - PullRequest
0 голосов
/ 05 июля 2011

У меня общий вопрос: что делать, когда поведение объекта должно меняться в зависимости от контекста?(Обратите внимание, что это касается SQL, а не C #, но я действительно мог бы использовать идеи здесь)

Например, класс Search, назовем его «SearchObject».Этот SearchObject получает поисковый запрос и возвращает 5 результатов от Google.Он делает это и только это.
Теперь у меня есть новое требование: если объект вызывается из определенного контекста, он добавляет результаты из другой поисковой системы.Например, если я вызываю поиск с веб-страницы, этот объект должен принести 10 результатов: первые 5 от Google, последние 5 от Bing.Если он вызывается из консольного приложения, он должен принести последние 5 результатов от AltaVista.

Как мне сохранить поведение этого объекта в соответствии с принципами ООП И получить желаемый результат?(Реализация будет в SQL, поэтому я не могу использовать шаблоны проектирования, которые я знаю в C # ...)

Спасибо!

Ответы [ 3 ]

1 голос
/ 05 июля 2011

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

Использовать параметр

просто передайте что-нибудь процедуре.Например,

Create Proc sp_Search (@Search varchar(500), @behavior int)
AS

if @behavior = 1
 ...
if @behavior = 2
...

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

Использовать что-то в сеансе

Вы также можете использовать информацию о сеансе.Например, APP_NAME()

Create Proc sp_Search (@Search varchar(500))
AS

if APP_NAME()=  'Application A'
 ...
if APP_NAME()= 'Application B'
...

Использовать определенного пользователя

Другой вариант - указать имена пользователей в контексте, который они 'Вы собираетесь использовать, а затем использовать CURRENT_USER

Create Proc sp_Search (@Search varchar (500)) AS

if CURRENT_USER()=  'ConsoleCreds'
 ...
if  CURRENT_USER()= 'WebCreds'
...

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

0 голосов
/ 07 июля 2011

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

Стратегия часто сочетается с шаблоном FactoryMethod .По сути, вызывайте FactoryMethod, передавая любые данные, необходимые для принятия решения.Он инкапсулирует фактическую логику принятия решений и возвращает экземпляр соответствующего объекта стратегии.

0 голосов
/ 05 июля 2011

Если бы я писал это на C #, я бы сделал что-то в духе наличия объекта контекста, который предоставляется SearchObject и выдает необходимые параметры.

Чтобы реализовать аналогичную идею в SQL, выбудет иметь таблицу контекста с ContextName, SearchEngine, TopX и т. д. и присоединить ее к таблице поиска (при условии, что вы выполняете какое-то кэширование здесь), чтобы получить свои результаты.

Что-то вроде ..

SELECT * FROM Searches s  
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.TopX
  AND   (searchterm = ... etc )
UNION
SELECT * FROM (SELECT s.*, rank() OVER (partition by search_term,search order by rank asc), FROM Searches s ORDER BY rank ASC)
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.BottomX
  AND   (searchterm = ... etc )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...