2015-02-26 2 views
0

Я пытаюсь создать и реализовать инфраструктуру для связи с сервером (это iOS-инфраструктура, написанная в Swift). Задача, с которой я столкнулся, - это архитектура - есть два способа общения с сервером, и я должен реализовать оба (разные версии). Я действительно хочу добиться наличия клиента без гражданства с такими методами, как: Client.authenticate() или Client.downloadFile(). Проблема заключается в том, имея две реализации, я бы в конечном итоге с помощью методов в моем классе Client, как этот:Правильный подход к архитектуре архитектуры клиент-сервер (разные версии сервера)

public class func authenticate(state: state) { 
    if (state.type == 1) { 
     Client1.authenticate(state) 
    } else { 
     Client2.authenticate(state) 
    } 
} 

Повторные для каждого метода ...

Я хотел изначально держать клиента, как это - stateless и static и имеют только объекты состояния, которые содержат фактическое состояние, так как может быть много соединений с сервером с различными состояниями. Тем самым я хотел избежать того, чтобы клиент был как объект, и оба держали состояние и выполняли вызовы на сервер. Проблема в том, что этот подход просто ... грязный, я думаю. Что было бы более сухим, читаемым и устойчивым способом сделать это?

ответ

1

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

Если ваш класс Клиент всегда использует либо Client1 или Client2 (или, более конкретно, если переменная каждого клиента объект state не меняется через всю жизнь это экземпляры), вы должны использовать Dependency Injection.

Вы создать procol (Давайте назовем его RemoteClient с authenticate методом (и любой другой метод, который клиент-сервер должен реализовать) и сделать Client1 и Client2 соответствует этому протоколу.

Теперь вы сделаете свой класс клиента принять RemoteClient в это конструктор

Теперь все, что создает объект клиента, он может решить, что впрыснуть в конструктор:.. объекта Client1 конкретного класса или Client2

Существует много статей о Dependency Injection, поэтому я не буду подробно рассказывать об этом.

Example article

Вы также можете использовать стратегии шаблон проектирования, который очень похож, но немного отличается по своим намерениям:

Strategy design pattern

Difference between DI and Strategy

EDIT

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

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

(псевдокод)

enum ServerType 
{ 
    client1, 
    client2 
} 

Dictionary* serversDictionary; // key = ServerType , value = object of protocol type RemoteLocation 

static init 
{ 
    serversDictionary[client1] = Client1.self; // using swift class metadata 
    serversDictionary[client2] = Client2.self; // using swift class metadata 
    } 

static authenticate(ServerType type) { 

let locationToSendAuthTo = serversDictionary[type]; 
locationToSendAuthTo.authenticate(type); 
} 

Я не уверен, если Свифт работает так, потому что я только начал использовать его. Я не уверен, можно ли вызвать статический метод для типа класса. Документы довольно тонкие. !

Подробнее здесь: Swift class introspection & generics

+0

Спасибо за ваш ответ, который я дал на свою первую первоначальную идею и на самом деле то, что вы suggested.I может видеть, что я не смог выяснить основную вещь, которую я хотел достичь - Клиент является статический класс (не инициализированный объект). Как бы я не вызвал POST в Alamofire (без инициализации клиента), я хотел вызвать методы на статическом клиенте (каждый раз вводить состояние). Задача заключалась в том, как это сделать, когда мне нужно две реализации клиента - я должен был бы иметь «маршрутизатор», чтобы вызывать «Client.performSth()» без «пользователя» SDK, который должен указать какой из них (Client1 или Client2). – Michal

+0

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

+0

Хорошо, теперь я понимаю. Я отредактировал свой ответ. –

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