Найти в Дзене
История одной ошибки
"Поиск не затягивает дело, а ошибки -- затягивают." (Им покоряется небо) Однажды перестали автоматически обрабатываться заказы. При ручной обработке было выявлено, что сумма заказа рассчитанная системой заказов отличалась от суммы заказа, рассчитанной в учетной системе на несколько копеек. Это касалось лишь тех заказов, число позиций в которых было больше одной. Причиной расхождения была ошибка в расчете величины новой комиссии. До этого, комиссионные сборы рассчитывались на каждую позицию в отдельности...
1 неделю назад
Наследование и полиморфизм
Наследование и полиморфизм две тесно связанные концепции для работы с абстракциями. Наследование определяет отношение "является" между абстракциями с разной степенью детализации, а полиморфизм определяет способы оперирования абстракциями. В программировании обычно выделяют три формы полиморфизма, которые различаются тем, что абстрагируется. Абстракция объектов через наследование. Все автомобили едут, все самолеты летают, а любой документ можно напечатать. В этом примере автомобиль, самолет или документ -- абстракция, определяющая общее поведение для реальных объектов...
5 месяцев назад
Инкапсуляция
Наши программные объекты являются отражением объектов реальности, состояние которых неразрывно связано с поведением. Возьмем для примера мяч. Его состояние можно описать размером, массой и положением. Размер и массу в небольших пределах мы можем изменить подкачивая мяч, а положение -- пнув его. И в первом и во втором случае воздействие на состояние происходит не прямым изменением параметров состояния, а через поведение мяча, как реакция на взаимодействие с ним. Подкачивая мы увеличиваем количество...
6 месяцев назад
Replace, объекты данных и гигантские запросы
Мне нравится LINQ. Но у всего есть свои пределы. В одном из проектов нужно было получать данные из базы. Для этого был набор запросов длиной до 300-400 строк, из которых 100-150 в предложении SELECT, а остальные в предложении FROM определяют 70-80 слияний разных видов. Ну и чуть-чуть условий. И дело не в том, что в контексте нужно было прописать 100+ таблиц. Запрос то уже есть, а его приходится писать заново, но уже на LINQ. И доказывать, что они дают один и тот же результат. Но нашелся другой путь...
9 месяцев назад
Мужчина или женщина
Как отделить мужчин от женщин? С людьми просто, они сами разойдутся в нужные группы. А если есть список содержащий только фамилии, имена и отчества и нужно проставить пол? Способ "ич/на" работает не всегда. Для статистического метода нужна статистика, а ее нет. Но мы-то всегда можем определить по конкретному ФИО пол человека. Поэтому нужен всего лишь помощник. Пусть в нашем списке есть Сидоров Иван Харитонович. Он мужчина. Но и все Иваны и Харитоновичи в нашем списке также будут мужчинами. Например Иван Сергеевич и Петр Харитонович...
9 месяцев назад
О единственной ответственности
SRP -- принцип единственной ответственности, утверждающий, что у класса должна быть одна причина для изменения. Первый в SOLID, но не единственный, у которого наименование вступает в диссонанс с содержанием. Мотиватором к его появлению послужило наше стремление разбивать код на обозримые компактные части для лучшей управляемости. Сам же принцип выражает крайний подход к этому разбиению. Наши программы основаны на объектах реальности. Да, порой это виртуальная или фантастическая реальность, но сути это не меняет...
10 месяцев назад
Инверсия иллюзий
DIP --принцип инверсии зависимостей. Название призывает инвертировать зависимости, определение задает их направление -- сверху вниз, а типовые примеры показывают способ сокрытия реализации. На деле же, все кроме сокрытия является иллюзией. Определение оперирует зависимостью модулей. Но модуль лишь структурная единица. У него нет собственной функциональности. Когда мы говорим, что модуль A зависит от модуля B, то это означает лишь то, что объекты модуля A зависят от объектов из модуля B. Зависимость между модулями вторична и формальна...
11 месяцев назад
Объектно-ориентированное программирование
Все окружающее нас -- объекты. Мы живем среди них, мы их создаем и используем. Наши действия, мысли идеи, понятия и фантазии тоже объекты. Поэтому программисты, всегда работали с объектами. Даже тогда, когда алгоритмические языки поддерживали лишь простые переменные и массивы, а для алгоритмов были лишь процедуры. Рассмотрим пример. Предположим у нас есть набор прямоугольников и кругов. и нам надо перемещать их. Нет записей? Не беда. Уложим координаты фигур в массивы X, Y, тогда индекс в этих массивах будет определять конкретную фигуру...
1 год назад
Как писать логи
Логи обеспечивают контроль за выполнением программы. Пока вы пишете программы для себя, можно не уделять им внимания, но для производственного программирования важность логов трудно переоценить. Ваша программа отправила запрос стороннему API на основе действий пользователя. Полученный ответ привел к сбою. Кто виноват? Ответ вы найдете в логах. Если вы его туда записали. Я всегда пишу лог трассировки. Он обеспечивает обзор процесса выполнения программы. При этом важно записывать сообщения обо всех этапах процесса, а не только сообщения об успешных действиях или произошедших ошибках...
1 год назад
Cтруктуры данных
Понятие переменной одно из основных понятий в программировании. Переменные хранят данные, с которыми работает программа. В этой связи говорят, что переменная имеет значение. Переменная всегда имеет значение, а значение всегда имеет тип. Тип переменной определяется типом значения, которое она хранит. В одних языках тип переменной статичен, в то время как в других он может меняться в тех или иных пределах. В своих программах мы присваиваем переменным имена. В памяти компьютера переменные определяются адресами байтов. Простая переменная содержит одно простое значение: число, символ, логическое или перечислимое значение...
1 год назад
Числа и программирование
Напишем небольшую программу. Каждый из вас может использовать свой любимый язык. a = Sqrt(2); WriteLine(a*a); Здесь Sqrt -- функция извлечения квадратного корня, а WriteLine выводит в консоль значение параметра. Запустите и посмотрите, что вы получите. У меня на C# вышло 2,0000000000000004. Почему так? Корень из двух -- бесконечная дробь, а для записи значения числа в памяти компьютера отводится конечное число байт. У нас нет возможности, представить √2 точно. Поэтому a*a в операторе вывода не равно (√2)². С корнем из двух проблема ожидаема, поскольку это иррациональное число. Но возьмем небольшое рациональное: 5/100...
1 год назад
Почему прямоугольник не квадрат
Написать программу, которая отображает движущиеся с постоянной скоростью прямоугольники и квадраты. В процессе движения, фигуры должны менять свои размеры и отображать текущую площадь. .Для решения задачи понадобятся следующие объекты. Подумав немного, вспоминаем, что вроде как квадрат, это прямоугольник с одинаковыми сторонами. Чтобы обеспечить одинаковость сторон, при установлении их длины будем менять и длину и высоту. Исходя из этих соображений строим следующую иерархию классов: class Rectangle {. Point Anchor{ get; set; }. int Width { get; set; }. int Height { get; set; }. int GetArea() { return Width*Height; } } class Square : Rectangle {...
1 год назад