Если нужно часто сериализовать объекты различных классов в строку, то можно добавить следующий метод расширения. Этот способ сократит ваш код сериализации до obj.ToXml(). StringWriter пишет строку в UTF-16...
Интерфейсы. Изначально ООП обходилось без них. Позже в C++ была неудачная попытка использовать вместо них классы, которая, однако, привела к пониманию проблемы и открыла путь к её решению. Нужна была абстракция поведения вне классификации и интерфейсы воплотили её. Окружающие нас объекты дружно игнорируют SRP -- гвоздь, ведро, автомобиль помимо своего индивидуального поведения имеют и общее: их можно купить, у них есть положение и габариты и они ржавеют со временем. Для отражения общих черт не хватает иерархической классификации, при которой наследование поведения возможно лишь по одной линии...
Часто для решения задачи существует более одного пути. Предположим понадобилось вычислить eˣ через известный ряд: В выражение входит факториал и нам нужны его значения для разных n. Можно решить задачу в лоб, использовав рекурсию, цикл или таблицу (ведь значений, которые уместятся в int или long не много). Но у этих методов есть большой недостаток: n! быстро растет и мы исчерпаем возможности представления чисел до того, как достигнем желаемой точности. Но есть иной путь -- не считать факториал. Заметим,...
"Поиск не затягивает дело, а ошибки -- затягивают." (Им покоряется небо) Однажды перестали автоматически обрабатываться заказы. При ручной обработке было выявлено, что сумма заказа рассчитанная системой заказов отличалась от суммы заказа, рассчитанной в учетной системе на несколько копеек. Это касалось лишь тех заказов, число позиций в которых было больше одной. Причиной расхождения была ошибка в расчете величины новой комиссии. До этого, комиссионные сборы рассчитывались на каждую позицию в отдельности...
Наследование и полиморфизм две тесно связанные концепции для работы с абстракциями. Наследование определяет отношение "является" между абстракциями с разной степенью детализации, а полиморфизм определяет способы оперирования абстракциями. В программировании обычно выделяют три формы полиморфизма, которые различаются тем, что абстрагируется. Абстракция объектов через наследование. Все автомобили едут, все самолеты летают, а любой документ можно напечатать. В этом примере автомобиль, самолет или документ -- абстракция, определяющая общее поведение для реальных объектов...
Наши программные объекты являются отражением объектов реальности, состояние которых неразрывно связано с поведением. Возьмем для примера мяч. Его состояние можно описать размером, массой и положением. Размер и массу в небольших пределах мы можем изменить подкачивая мяч, а положение -- пнув его. И в первом и во втором случае воздействие на состояние происходит не прямым изменением параметров состояния, а через поведение мяча, как реакция на взаимодействие с ним. Подкачивая мы увеличиваем количество...
Мне нравится LINQ. Но у всего есть свои пределы. В одном из проектов нужно было получать данные из базы. Для этого был набор запросов длиной до 300-400 строк, из которых 100-150 в предложении SELECT, а остальные в предложении FROM определяют 70-80 слияний разных видов. Ну и чуть-чуть условий. И дело не в том, что в контексте нужно было прописать 100+ таблиц. Запрос то уже есть, а его приходится писать заново, но уже на LINQ. И доказывать, что они дают один и тот же результат. Но нашелся другой путь...
Как отделить мужчин от женщин? С людьми просто, они сами разойдутся в нужные группы. А если есть список содержащий только фамилии, имена и отчества и нужно проставить пол? Способ "ич/на" работает не всегда. Для статистического метода нужна статистика, а ее нет. Но мы-то всегда можем определить по конкретному ФИО пол человека. Поэтому нужен всего лишь помощник. Пусть в нашем списке есть Сидоров Иван Харитонович. Он мужчина. Но и все Иваны и Харитоновичи в нашем списке также будут мужчинами. Например Иван Сергеевич и Петр Харитонович...
SRP -- принцип единственной ответственности, утверждающий, что у класса должна быть одна причина для изменения. Первый в SOLID, но не единственный, у которого наименование вступает в диссонанс с содержанием. Мотиватором к его появлению послужило наше стремление разбивать код на обозримые компактные части для лучшей управляемости. Сам же принцип выражает крайний подход к этому разбиению. Наши программы основаны на объектах реальности. Да, порой это виртуальная или фантастическая реальность, но сути это не меняет...
DIP --принцип инверсии зависимостей. Название призывает инвертировать зависимости, определение задает их направление -- сверху вниз, а типовые примеры показывают способ сокрытия реализации. На деле же, все кроме сокрытия является иллюзией. Определение оперирует зависимостью модулей. Но модуль лишь структурная единица. У него нет собственной функциональности. Когда мы говорим, что модуль A зависит от модуля B, то это означает лишь то, что объекты модуля A зависят от объектов из модуля B. Зависимость между модулями вторична и формальна...
Все окружающее нас -- объекты. Мы живем среди них, мы их создаем и используем. Наши действия, мысли идеи, понятия и фантазии тоже объекты. Поэтому программисты, всегда работали с объектами. Даже тогда, когда алгоритмические языки поддерживали лишь простые переменные и массивы, а для алгоритмов были лишь процедуры. Рассмотрим пример. Предположим у нас есть набор прямоугольников и кругов. и нам надо перемещать их. Нет записей? Не беда. Уложим координаты фигур в массивы X, Y, тогда индекс в этих массивах будет определять конкретную фигуру...
Логи обеспечивают контроль за выполнением программы. Пока вы пишете программы для себя, можно не уделять им внимания, но для производственного программирования важность логов трудно переоценить. Ваша программа отправила запрос стороннему API на основе действий пользователя. Полученный ответ привел к сбою. Кто виноват? Ответ вы найдете в логах. Если вы его туда записали. Я всегда пишу лог трассировки. Он обеспечивает обзор процесса выполнения программы. При этом важно записывать сообщения обо всех этапах процесса, а не только сообщения об успешных действиях или произошедших ошибках...