Страницы

вторник, 17 апреля 2012 г.

Абстракция – предмет простой.

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

Абстра́кция  - отвлечение в процессе познания от несущественных сторон, свойств, связей объекта (предмета или явления) с целью выделения их существенных, закономерных признаков.

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

Настоящая абстракция чрезвычайно проста.

Что это значит? Давайте посмотрим на примере. Допустим у нас есть такой класс:

public class Person 
{
    public Name Name [get;set;}
    
    public Sex Sex {get;set;}
    
    public Person Mother {get; set;}
    
    public Person Father {get; set;}
    
    public IEnumerable<Person> Children {get; set;}
    
    public DateTime DateOfBirth {get; set;}
    
    public Passport Passport {get;set;}
    
    public Passport ForeignPassport {get;set;}
    
    public DriverLicense DriverLicense {get;set}
}

  Вроде бы не слишком сложно, да? На первый взгляд Person можно было бы назвать абстракцией “человек”. Но на самом деле это не абстракция. Во-первых, мы пытались смоделировать объект реального мира, впихнув все свойства, которые к нему относятся: семейно положение, гражданство, водительские права, личная информация. Проблема в том, что реального мира не существует в мире (хороших) программ, они живут отношениями клиент-сервер (на уровне классов), При этом клиента мало интересуют потроха сервера.


  А что же такое настоящая абстракция? Извольте осмотреть пару примеров:

public interface IDriver 
{
    DriverLicencse {get;}
}
public interface ICitizen 
{
    public Passport Passport {get;}
    
    public Passport ForeignPassport {get;}
}

  И это действительно абстракции, с которыми могут оперировать другие классы. Главное отличие Person от IDriver – полное отсутствие нерелевантных деталей! Только самая суть, которая отличает гражданина от человека. Такой подход к пониманию абстракций есть суть ISP. Хорошая абстракция вряд ли может содержать более пяти членов (а идеальная -один). Но есть и хорошая новость – всё вышесказанное не означает, что надо отказаться от Person, и поделить его на более мелкие классы. Person - реализация не обязана быть простой, и может включать в себя реализацию нескольких абстракций. Просто не обманывайте себя, называя абстракцией всё, что включает в себя слова interface и abstract. Это лишь технические детали, элементы языка программирования, не более.


  Теперь, вооружившись новым (или не очень) взглядом на абстракции, внимательно посмотрите на свой код. Не увлекайтесь “абстракционизмом”, это не так красиво, как автору хочется верить. Улыбка

Комментариев нет:

Отправить комментарий