Вопрос по интерфейсам в C # - PullRequest
7 голосов
/ 21 июля 2011

Вот мой вопрос ...

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

Мой вопрос: как это можно смоделировать с помощью интерфейсов в C #? Программное обеспечение, которое у меня есть, не использует какие-либо интерфейсы и какие бы то ни было классы, просто чтобы удовлетворить тот факт, что код не может жить вне классов.

Я знаком с концепцией интерфейсов, по крайней мере, на теоретическом уровне, но не очень знаком с концепцией программирования для интерфейсов.

Я имею в виду следующее:

Создайте интерфейс с именем IServiceQualification, для которого будет определена операция: void Qualify (). Имейте два класса, названных QualifyByNumber и QualifyByAddress, и оба они реализуют интерфейс и определяют детали операции Qualify. Думаю ли я в правильном направлении или есть другой / лучший способ решения этой проблемы.

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

Комментарии / предложения приветствуются.

Ответы [ 3 ]

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

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

http://www.dofactory.com/Patterns/PatternStrategy.aspx

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

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

Вот пример, который примерно нацелен на вашу ситуацию (но потребует большего моделирования).

public interface IServiceQualification{
    bool Qualifies(Service serv);
}

public class ClientTelephoneService : IServiceQualification
{
    public bool Qualifies(Service serv){
       return serv.TelNumber.Contains("01234");
    }
}

public class ClientAddressService : IServiceQualification
{
    public bool Qualifies(Service serv){
       return serv.Address.Contains("ABC");
    }
}

//just a dummy service
public class Service{
    public string TelNumber = "0123456789";
    public string Address = "ABC";
}

//implementation of a checker which has a list of available services and takes a client who implements the
//interface (meaning we know we can call the Qualifies method
public class ClassThatReturnsTheAvailableServices
{
    //ctor
    List<Service> services = //your list of all services

    public List<Service> CheckServices(IServiceQualification clientServiceDetails)
    {
        var servicesThatQualify = new List<Service>();
        foreach(var service in services){
            if(clientServiceDetails.Qualifies(service)){
                 services.Add(service);
            }
        }
        return servicesThatQualify;
    }
}
1 голос
/ 21 июля 2011

Я бы, наверное, немного углубился, но вы на правильном пути. Я бы лично создал IServiceQualification с помощью метода Qualify, а затем ниже этого абстрактного класса с именем ServiceQualification, который будет иметь абстрактный метод с именем Qualify, который может реализовать любой класс квалификаторов. Это позволяет вам определять общее поведение среди ваших квалификаторов (они обязательно должны быть), в то же время создавая разделение интересов на высоком уровне.

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

public bool ShouldQualify(IServiceQualification qualification)

И независимо от того, какую реализацию мы отправим, этот метод будет работать. Это становится чем-то, что вам никогда не придется менять или модифицировать после того, как оно заработало. Кроме того, это приводит вас непосредственно к ошибкам. Если кто-то сообщает, что квалификация по адресу не работает, вы точно знаете, где искать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...