Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public void Process()
{
var processor = new EmptyProcessor();
int result = DoProcess(new Order(), processor);
}
private int DoProcess(Order order, Processor processor)
{
return processor.Process(order);
}public void Process()
{
int result = DoProcess(new Order(), null);
}
private int DoProcess(Order order, Processor processor)
{
return processor?.Process(order) ?? 0;
}return Employees
?.SingleOrDefault(x => x.IsAdmin)?.Address?.ToString();
var boss = customer.Employees.Max(x => x.Salary).FirstOrDefault();
Нет, инкапсуляция — это объединение данных с логикой + сокрытие информации от клиентов:Как это нет, когда по вашей ссылке:
Encapsulation is used to hide the values or state of a structured data object inside a class, preventing unauthorized parties' direct access to them.
Поясните вопрос, не уверен что понял.Далее, мы используем класс Employee, стало быть для получения адреса нам нужно вызвать его метод. Иначе, мы используем функцию ToString() на внутренних данных другого класса, что по вашей логике есть нарушение инкапсуляции. IsAdmin, кстати, тоже, видимо не получится использовать и придётся писать ещё и GetAdmin()
К примеру опрос с целью сохранения части кастомеров во внешней коллекции по каким-то признакам — не является нарушением инкапсуляции.Ага, то есть, если я хочу сохранить часть кастомеров — это хорошо. А если я хочу сохранить часть работников кастомера — это плохо. То есть, я могу, но только через метод. Хотя геттер — тоже метод, но он даёт мне возможность выбирать любые варианты. Не сходится.
Пример выше:
var boss = customer.Employees.Max(x => x.Salary).FirstOrDefault();
— является
Нужно больше данных, непонятно что конкретно вы имеете ввидуВ данном методе вы ищете администратора. Хорошо, бывает. Потом, я захотел найти не-администратора с зарплатой до 100 рублей и фамилией Нафтазаров, и выяснить его стаж, а не адрес. Ещё один метод писать?
Здесь уже спрашивали, но я спрошу ещё раз, раз речь про инкапсуляцию: как она нарушается?
Если у клиента Customer открыты Employees, что нам мешает их опрашивать?
public void Process()
{
var processor = new EmptyProcessor();
int result = DoProcess(new Order(), processor);
}
private int DoProcess(Order order, Processor processor)
{
return processor.Process(order);
}
Код выше нарушает принципы инкапсуляции.
public void DoSomething(Customer customer)
{
string address = customer?.Employees
?.SingleOrDefault(x => x.IsAdmin)?.Address?.ToString();
SendPackage(address);
}public void DoSomething(Customer customer)
{
Contract.Requires(customer != null);
string address = customer.GetAdminAddress();
SendPackage(address);
}очему не стоит под паттерн NullObject использовать значение null?
null — это бросить NRE, в то время как Null Object может предоставлять осмысленные (в данном контексте) заглушки.В 99% задач достаточно такого поведения для паттерна Null Object.
?.), и получаю разумные значения. Скажем, характерный пример Null Object — это когда метод должен возвращать IEnumerable<T>, и если значений нет, то он возвращает не null, а пустой энумератор, что позволяет писать код без дополнительных проверок.Если обычным кодом назвать код с '?.',
Семантика исходная с небольшим изменением:
Зачем coalescing, если достаточно расширить результирующий тип до: TResult | null?
foreach по null, а Stream.CopyTo(null) даст ArgumentNullException. И так далее.null где-то глубоко внутри, вы вынуждены теперь оборачивать проверками каждый уровень до самого верха (или пока вы не сделаете coalesce).
3 способа использовать оператор?.. неправильно в C# 6