Jump to content

Сгусток данных

В объектно-ориентированном программировании «группа данных» — это имя, данное любой группе переменных , которые передаются вместе (группой) в различных частях программы. Комок данных, как и другие запахи кода , может указывать на более глубокие проблемы с проектированием или реализацией программы. Группа переменных, которые обычно составляют группу данных, часто тесно связаны или взаимозависимы и в результате часто используются вместе в группе. Сгусток данных также известен как особый вид запаха кода на уровне класса , который может быть признаком плохо написанного исходного кода.

Рефакторинг групп данных

[ редактировать ]

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

Процесс удаления комков данных сопряжен с риском создания другого типа запаха кода (класса данных, который представляет собой класс, который только хранит данные и не имеет никаких методов для фактической работы с данными); однако создание класса побудит программиста увидеть функциональные возможности, которые также могут быть включены сюда. [1] [2]

В объектно-ориентированном программировании цель объектов — инкапсулировать как соответствующие данные (поля), так и операции ( методы ), которые можно выполнить с этими данными. [3] Неспособность сгруппировать поля в настоящий объект может препятствовать объединению соответствующих действий.

Длинный список параметров/переменных не обязательно указывает на скопление данных; только когда различные значения здесь тесно и логически связаны, их присутствие считается скоплением данных. Хотя такие случаи редки, метод может законно принимать полдюжины или более совершенно несвязанных параметров, которые невозможно аккуратно превратить в один объект. Однако это говорит о том, что метод пытается сделать слишком много, и его лучше разбить на несколько методов, каждый из которых отвечает за меньшую часть общей ответственности. Это открывает еще одну возможность использовать рефакторинг для улучшения качества кода.

Рефакторинг для устранения комков данных не нужно выполнять вручную. Многие современные полнофункциональные IDE имеют функциональные возможности (часто называемые «Извлечение класса»), которые позволяют выполнять этот рефакторинг автоматически или почти автоматически. Это может снизить стоимость и повысить надежность рефакторинга, что позволит разработчикам, которые в противном случае сопротивлялись бы, сделать это целесообразно.

Естественно, сгустки данных могут существовать в любом объектно-ориентированном языке программирования. Пример ниже был выбран просто из-за его простоты по объему и синтаксису.

До рефакторинга

public void AddCoords(int x, int y, int z) { /* … */ }

Пост-рефакторинг

public void AddCoords(Coords coords) { /* … */ }

public class Coords
{
    public Coords(int x, int y, int z)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public int X { get; }
    public int Y { get; }
    public int Z { get; }
}
public static void main(String args[]) {
    String firstName = args[0];
    String lastName = args[1];
    Integer age = new Integer(args[2]);
    String gender = args[3];
    String occupation = args[4];
    String city = args[5];
    welcomeNew(firstName, lastName, age, gender, occupation, city);
}

public static void welcomeNew(String firstName, String lastName, Integer age, String gender, String occupation, String city) {
    System.out.printf("Welcome %s %s, a %d-year-old %s from %s who works as a%s\n",firstName, lastName, age, gender, city, occupation);
}

В предыдущем примере все переменные могли быть инкапсулированы в один объект «Person», который можно было передавать отдельно. Кроме того, программист может затем распознать, что welcomeNew метод будет лучше связан с Person class, а затем мог бы придумать другие соответствующие действия, связанные с Person. Например, код можно реорганизовать и расширить следующим образом:

public static void main(String args[]) {
    String firstName = args[0];
    String lastName = args[1];
    Integer age = new Integer(args[2]);
    String gender = args[3];
    String occupation = args[4];
    String city = args[5];

    Person joe = new Person(firstName, lastName, age, gender, occupation, city);
    joe.welcomeNew();
    joe.work();
}

private static class Person {
    /* All parameters have been moved to the new Person class where they are properly grouped and encapsulated */
    String firstName;
    String lastName;
    Integer age;
    String gender;
    String occupation;
    String city;
    
    public Person(String firstName, String lastName, Integer age, String gender, String occupation, String city) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.gender = gender;
        this.occupation = occupation;
        this.city = city;
    }
    
    /* Existing functionality relating to the data can also be incorporated into the new class, reducing the risk of scope collision */
    public void welcomeNew() {
        System.out.printf("Welcome %s %s, a %d-year-old %s from %s who works as a%s\n", firstName, lastName, age, gender, city, occupation);
    }
    /* Additionally, the new class may be an opportunity for new functionality to be added */
    public void work() {
        System.out.printf("This is %s working hard on %s in %s", firstName, occupation, city);
    }
}

Хотя это и увеличило длину кода, теперь одного Person можно легко передать как один объект, а не как множество (казалось бы, несвязанных) полей. Кроме того, это дает возможность перемещать связанные методы в класс, чтобы они могли легко работать с отдельными его экземплярами. Эти методы больше не требуют передачи утомительного списка параметров, поскольку вместо этого они сохраняются как переменные экземпляра самих экземпляров объекта. [4]

  1. ^ Фаулер, Мартин. «Кламп данных» . Проверено 10 февраля 2017 г. .
  2. ^ «Сгустки данных» . Создание исходников . Проверено 10 февраля 2017 г. .
  3. ^ Киндлер, Э.; Кривой, И. (2011). «Объектно-ориентированное моделирование систем со сложным управлением». Международный журнал общих систем: 313–343. {{cite journal}}: Для цитирования журнала требуется |journal= ( помощь )
  4. ^ «В чем разница между переменной класса и переменной экземпляра? - Вопросы и ответы на собеседовании с программистом и программным обеспечением» . Вопросы и ответы на собеседовании с программистом и программистом . Проверено 20 февраля 2017 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c999f467eb70c987b90b0744d1c19e6f__1594403460
URL1:https://arc.ask3.ru/arc/aa/c9/6f/c999f467eb70c987b90b0744d1c19e6f.html
Заголовок, (Title) документа по адресу, URL1:
Data clump - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)