Как использовать интерфейс в моем коде, чтобы сделать его более масштабным? - PullRequest
4 голосов
/ 13 января 2012

У меня есть веб-приложение ASP.NET, в котором есть проект пользовательского интерфейса и проект BL.Проект BL обрабатывает всю бизнес-логику и часть доступа к данным. Я вызываю методы BL из моего пользовательского интерфейса, просто вызывая метод в экземплярах.

Public Class User

    Public Property UserID As Integer
    Public Property FirstName As String
    //rest of the properties for user


  Public Sub Save()
   //save the details to the database
  End sub
End Class

и из моего пользовательского интерфейса (в C #) я делаю это.

  User objUser=new User();
  objUser.FirstName="Happy";
  objUser.Save();

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

Может кто-нибудь дать мне образец, как это сделать?

Ответы [ 4 ]

2 голосов
/ 13 января 2012

Взгляните на шаблон проектирования Model-View-Controller и структуру asp.net mvc .Вот хороший обзор здесь , который объясняет преимущества этой стратегии проектирования.

Вот выдержка:

Шаблон MVC помогает создавать приложения, которые разделяютразличные аспекты приложения (логика ввода, бизнес-логика и логика пользовательского интерфейса), обеспечивая при этом слабую связь между этими элементами.Шаблон указывает, где каждый вид логики должен быть расположен в приложении.Логика пользовательского интерфейса принадлежит в представлении.Входная логика принадлежит контроллеру.Бизнес-логика принадлежит модели.Это разделение помогает вам управлять сложностью при создании приложения, поскольку оно позволяет вам сосредоточиться на одном аспекте реализации одновременно.Например, вы можете сосредоточиться на представлении, не завися от бизнес-логики.

Слабая связь между тремя основными компонентами приложения MVC также способствует параллельной разработке.Например, один разработчик может работать с представлением, второй разработчик может работать с логикой контроллера, а третий разработчик может сосредоточиться на бизнес-логике в модели.

1 голос
/ 13 января 2012

Интерфейс - это описание функциональности для класса.Любой класс, реализующий интерфейс, должен реализовывать свойства, методы, индексаторы и / или события интерфейса.Интерфейс не содержит реализации, только подписи для функциональности, которую предоставляет интерфейс.

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

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

Вот простой пример того, как ваш код может использовать интерфейс (используя VB.NET):

Public Interface iPerson
    Property FirstName As String
    Property LastName As String
    'Rest of properties for a person

    Sub Save()
End Interface

Public Class User
    Implements iPerson

    Public Property UserId As Integer

    Public Property FirstName As String Implements iPerson.FirstName
    Public Property LastName As String Implements iPerson.LastName

    Public Sub Save() Implements iPerson.Save
        'Add code to save user
    End Sub
End Class

И из вашего пользовательского интерфейса вы можете сделать:

Dim objUser as iPerson = New User

objUser.FirstName = "Bob"
objUser.LastName = "Mckenzie"
ctype(objUser, User).UserId = 12345

Если вызатем решил создать новый класс, реализующий iPerson (т.е. - SuperUser), большая часть кода в вашем пользовательском интерфейсе может остаться прежней:

Dim objUser as iPerson = New SuperUser

objUser.FirstName = "Bob"
objUser.LastName = "Mckenzie"

'The next line would throw a runtime error since object is not of type user
ctype(objUser, User).UserId = 12345
1 голос
/ 13 января 2012

Кодирование интерфейсов дает множество преимуществ, лучшая тестируемость является одним побочным эффектом, связанным с основным преимуществом: отделение объекта от его зависимостей .

СкажемУ меня есть класс A, и в его реализации он использует класс B. Если вы не предоставляете интерфейс для B, то вы тесно связали дизайн A и B вместе (вы не можете рассмотреть A без этогоконкретная реализация B, так как она использует конкретную реализацию).

Если вы пишете интерфейс для B (скажем, IB) и используете его в A вместо непосредственного использования B, то вы развязали дизайн и сделал их независимыми.Теперь A может функционировать независимо от конкретного дополнения B, он знает только интерфейс к нему (IB) и методы, необходимые для его работы.Поэтому, если позже вы решите, что ваша реализация B не была хорошей, или если вы хотите, чтобы A мог работать с двумя различными IB в зависимости от контекста, вы можете заменить B на B2, , который также реализует IB, поэтому вам вообще не нужно изменять A.

Действие по созданию A путем внедрения реализации IB во время выполнения выглядит так:

A myA = new A(new B());  // this could also be new A(new B2()); or anythign else that implements IB

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


Для целей тестирования вы можете затем unit-test A, не делая предположений для B (который, очевидно, должен быть проверен отдельно).Таким образом, в ваших тестах вы можете внедрить в A заглушку или поддельную реализацию B, которая поможет вам протестировать поведение, которое вы хотите.

(Извините, никаких реальных примеров кода, так как яJava разработчик и не очень хорошо с синтаксисом C #)

0 голосов
/ 13 января 2012

Вы можете добавить слой, чтобы соединить интерфейс и BL.Я не фанат пользовательского интерфейса, ничего не зная о BL.Это можно сделать с помощью интерфейсов, но это не обязательно с ними.

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