Есть ли когда-нибудь применение для класса, который содержит только открытые поля экземпляра?
Я проводил проверку кода и увидел класс, созданный разработчиком, который содержал только открытые поля экземпляра. Этот класс не используется в бизнес-логике; он просто используется для хранения тестовых данных (разработчик создал их для теста).
Это хорошо? Почему или почему нет?
4 ответа
Это определенно то, что я буду подвергать сомнению.
Если он используется только для тестирования, то должно быть легко определить, что он будет использоваться только для тестирования. Это можно сделать, используя согласованный стандарт именования, или ваши тестовые классы могут быть отделены от вашего производственного кода (возможно, в другом проекте или эквивалентном контейнере для вашего языка).
Если это класс, который просто содержит тестовые данные, и он помогает выполнить тест, то, может быть... Но, возможно, стоит задать вопрос, где еще разработчик откровенно выставляет участников?
Например, в Python нет такого понятия, как закрытое поле. Вы добавляете имена учеников с подчеркиванием, если хотите обозначить их как личные, и надеетесь, что люди, которые не знают, что они делают, не будут связываться с ними. Итак... похоже, это не делает программы Python более подверженными ошибкам или небезопасными. Поэтому я бы сказал - это определенно не проблема, особенно если учесть, что в этом нет бизнес-логики.
Иногда могут подходить классы, которые просто имеют открытые поля экземпляра. На самом деле, я думаю, что Рамочная основа выиграла бы от стандартного класса этой формы. По существу:
открытый класс MutableHolder { публичное значение T; public MutableHolder() {} public MutableHolder(T initValue) {Значение = initvalue); }
Ожидание будет таким MutableHolder<T>
может использоваться в тех случаях, когда полезно иметь возможность выполнять кусочные модификации или атомарные модификации вещей, хранящихся в общем List
или же Dictionary
, Например, если у кого-то есть List<MutableHolder<Rectangle>>
можно сказать MyList[3].Value.Width += 7;
и если есть Dictionary<String, MutableHolder<Integer>
можно сказать Threading.Interlocked.Increment(ref MyDict[someString].Value);
, Обратите внимание, что семантика MutableHolder<T>
очень ясно, и вся цель типа заключается в том, чтобы вести себя точно так же, как класс с одним открытым полем типа T
, Инкапсуляция должна выполняться не по типу MutableHolder<T>
а точнее его потребители.
Однако я хотел бы предположить, что во многих случаях вместо создания класса с открытыми полями экземпляра было бы лучше определить структуру с открытыми полями, а затем использовать что-то вроде MutableHolder<T>
держать его. В общем, изменяемые классы держателей данных не должны передаваться между методами. Вместо этого следует передавать данные в форме, которая дает понять, что они передаются вокруг данных, а не изменяемого объекта-держателя. Наличие методов, передающих изменяемые структуры данных, сделало бы это ясным.