Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

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




  •  Часы


  •  Поиск

Optimaze » Программирование » Атрибуты и аннотации: метаданные против чистоты кода




Атрибуты и аннотации: метаданные против чистоты кода



    Атрибуты (Attributes) в языке C# - это удобный способ добавления метаданных к классу, свойству или методу. Этот инструмент иногда может быть очень полезным, но всегда ли его применение оправдано? Например, допустим у нас имеется класс Person:

     

    • public class Person {
    • public string FirstName {get; set;}
    • public string LastName {get; set;}

    }

     

    С помощью атрибута Serializable можно указать, что экземпляры этого класса могут сериализоваться, не используя интерфейс ISerializable:

     

    • [Serializable]
    • public class Person {
    • public string FirstName {get; set;}
    • public string LastName {get; set;}
    • }

     

    В общем, можно найти множество задач, где без атрибутов ну просто никуда. Но в некоторых случаях, по моему мнению, атрибуты вносят в код совершенно ненужные зависимости и нарушают его “чистоту”.

    Допустим, наш объект Person храниться в базе данных и мы решили использовать ORM фреймворк для его получения/сохранения. Большинство ORM фреймворков допускают два типа настройки меппинга - через атрибуты или через xml-конфигурацию. Допустим, мы выбрали вариант с атрибутами. Наш класс превратится во что-то вроде этого:

     

    • [Serializable]
    • [Table(Name="person")]
    • public class Person {
    • [Column(Name="first_name")]
    • [AllowNull(false)]
    • [PrimaryKey]
    • public string FirstName {get; set;}
    • [Column(Name="last_name")]
    • [AllowNull]
    • public string LastName {get; set;}
    • }

     

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

     

    • [Serializable]
    • [Table(Name="person")]
    • public class Person {
    • [Column(Name="first_name")]
    • [AllowNull(false)]
    • [PrimaryKey]
    • [Required]
    • [MaxLength(50)]
    • [MinLength(10)]
    • public string FirstName {get; set;}
    • [Column(Name="last_name")]
    • [AllowNull]
    • [Required]
    • [MaxLength(20)]
    • [MinLength(5)]
    • public string LastName {get; set;}
    • }

     

    Теперь давайте посмотрим на наш класс. Во-первых он стал в два раза больше по количеству строк. Если учесть, что добавленные строки - это метаданные, а не код, то очевидно, что читаемость кода ухудшилось. Но это не самое плохое.

    А плохо то, что наш класс теперь зависит от классов фреймворков ORM и валидации. А так как Person - класс предмеьной области, то он должен быть отделен от слоя доступа к данным и рендеринга вида. Причем, это разделение пожет быть как условным, так и физическим, когда предметная область выделена в отдельную сбоку/jar.

    Тогда вся сборка получит совершенно ненужную зависимость от классов других слоев. Да и вообще, лушчее решение для предметной области - это набор POCO/POJO классов, не зависящих ни от каких сторонних библиотек. Но и это еще не все. Теперь давайте представим, что мы захотели реализовать алитернативный способ хранения с использованием другого ORM. Тогда количество атрибутов и зависимостей должно удвоится?

     

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



    Рейтинг: 4.6/5, основан на 25 голосах.


    Нравится



    Вернутся назад


       

    Вам будет интересно:

    Почему не работает функция strtolower()

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

    JSR 272 Early Draft Review

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

    Алгоритм Брезенхема

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

    Автоматизация обработки космических снимков в ArcMap

    Выражаю автору благодарность за проделанный мануал, он действительно помог многим.



    •  Публикации


    8 методов раскрутки своего форума с нуля

    8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

    Как привлекать посетителей на проект

    Как привлекать посетителей на проект Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.

    Про MySQL, серверы и PayPal

    Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

    Реклама в Твиттере. Как подать свой продукт

    Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

    Пока блог на локалхосте

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

    Авторитет блоггера притягивает

    Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.