Найти тему
О единственной ответственности
SRP -- принцип единственной ответственности, утверждающий, что у класса должна быть одна причина для изменения. Первый в SOLID, но не единственный, у которого наименование вступает в диссонанс с содержанием. Мотиватором к его появлению послужило наше стремление разбивать код на обозримые компактные части для лучшей управляемости. Сам же принцип выражает крайний подход к этому разбиению. Наши программы основаны на объектах реальности. Да, порой это виртуальная или фантастическая реальность, но сути это не меняет...
2 дня назад
Инверсия иллюзий
DIP --принцип инверсии зависимостей. Название призывает инвертировать зависимости, определение задает их направление -- сверху вниз, а типовые примеры показывают способ сокрытия реализации. На деле же, все кроме сокрытия является иллюзией. Определение оперирует зависимостью модулей. Но модуль лишь структурная единица. У него нет собственной функциональности. Когда мы говорим, что модуль A зависит от модуля B, то это означает лишь то, что объекты модуля A зависят от объектов из модуля B. Зависимость между модулями вторична и формальна...
1 месяц назад
Объектно-ориентированное программирование
Все окружающее нас -- объекты. Мы живем среди них, мы их создаем и используем. Наши действия, мысли идеи, понятия и фантазии тоже объекты. Поэтому программисты, всегда работали с объектами. Даже тогда, когда алгоритмические языки поддерживали лишь простые переменные и массивы, а для алгоритмов были лишь процедуры. Рассмотрим пример. Предположим у нас есть набор прямоугольников и кругов. и нам надо перемещать их. Нет записей? Не беда. Уложим координаты фигур в массивы X, Y, тогда индекс в этих массивах будет определять конкретную фигуру. Процедура перемещения в этом случае может выглядеть так: C Перемещение фигуры SHAPE на DX, DY...
2 месяца назад
Как писать логи
Логи обеспечивают контроль за выполнением программы. Пока вы пишете программы для себя, можно не уделять им внимания, но для производственного программирования важность логов трудно переоценить. Ваша программа отправила запрос стороннему API на основе действий пользователя. Полученный ответ привел к сбою. Кто виноват? Ответ вы найдете в логах. Если вы его туда записали. Я всегда пишу лог трассировки. Он обеспечивает обзор процесса выполнения программы. При этом важно записывать сообщения обо всех этапах процесса, а не только сообщения об успешных действиях или произошедших ошибках. Предположим вы грузите файлы с FTP партнера, проверяя его каждые пять минут...
6 месяцев назад
Cтруктуры данных
Понятие переменной одно из основных понятий в программировании. Переменные хранят данные, с которыми работает программа. В этой связи говорят, что переменная имеет значение. Переменная всегда имеет значение, а значение всегда имеет тип. Тип переменной определяется типом значения, которое оно хранит. В одних языках тип переменной статичен, в то время как в других он может меняться в тех или иных пределах. В своих программах мы присваиваем переменным имена. В памяти компьютера переменные определяются адресами байтов. Простая переменная содержит одно простое значение: число, символ, логическое или перечислимое значение...
6 месяцев назад
Числа и программирование
Напишем небольшую программу. Каждый из вас может использовать свой любимый язык. a = Sqrt(2); WriteLine(a*a); Здесь Sqrt -- функция извлечения квадратного корня, а WriteLine выводит в консоль значение параметра. Запустите и посмотрите, что вы получите. У меня на C# вышло 2,0000000000000004. Почему так? Корень из двух -- бесконечная дробь, а для записи значения числа в памяти компьютера отводится конечное число байт. У нас нет возможности, представить √2 точно. Поэтому a*a в операторе вывода не равно (√2)². С корнем из двух проблема ожидаема, поскольку это иррациональное число. Но возьмем небольшое рациональное: 5/100...
6 месяцев назад
Почему прямоугольник не квадрат
Написать программу, которая отображает движущиеся с постоянной скоростью прямоугольники и квадраты. В процессе движения, фигуры должны менять свои размеры и отображать текущую площадь. .Для решения задачи понадобятся следующие объекты. Подумав немного, вспоминаем, что вроде как квадрат, это прямоугольник с одинаковыми сторонами. Чтобы обеспечить одинаковость сторон, при установлении их длины будем менять и длину и высоту. Исходя из этих соображений строим следующую иерархию классов: class Rectangle {. Point Anchor{ get; set; }. int Width { get; set; }. int Height { get; set; }. int GetArea() { return Width*Height; } } class Square : Rectangle {...
7 месяцев назад
Одновременность в моделировании
Задача Нужно смоделировать перекресток. Объектами имитации будут светофоры, автомобили, водители и пешеходы. Основной цикл Любая программа для имитационного моделирования имеет основной цикл, определяющий течение времени. При этом можно использовать как непосредственное счисление времени так и абстрактные такты, а время считать как произведение такта на его длительность. В последнем случае ценой использования умножения на каждом такте мы можем избежать накопления ошибки в счислении времени из-за конечного представления чисел. Состояния Объект моделирование имеет состояние, которое так или иначе изменяется с течением модельного времени...
11 месяцев назад
Куда положить интерфейс
Задача Предположим, что мы загружаем информацию о билетах с сервиса поставщика и хотим отслеживать, какие билеты мы уже загрузили, а какие нет. Определять будем по номеру билета. Для простоты условимся, что вся остальная необходимая информация о билете укладывается в некое "описание". Агенты Для решения задачи нам понадобятся: Процессор и интерфейсы Для реализации обработчика создадим класс Processot с методом CheckTickets. Этот метод будет решать свою задачу используя модели билетов (ITicket), поставщика билетов (ITickerPrivider), и хранилища (ITicketStorage). class Processor {. ITicketProvider ticketProvider...
1 год назад
Как вас называть
Задача Мы хотим получать статьи о городах. У нас есть несколько поставщиков которые выдают их по коду города. Однако централизованного списка кодов городов нет, и каждый из поставщиков имеет свои коды городов. Мы предполагаем, что со временем, число поставщиков будет увеличиваться. Нужен сервис, который хранил бы информацию о кодах городов и позволял бы коду одного поставщика найти код другого. Система - тип - идентификатор Мы можем рассматривать поставщиков как некую систему идентификации городов уникальными идентификаторами. Тогда полный ключ города у любого поставщика можно представить как тройку <система, тип, идентификатор>...
1 год назад
Идеальная модель и реальность
Мониторить FTP и загружать с него появляющиеся там файлы. Файлы лежат в различных папках, имеющих подпапку AIR, в которой и находятся интересующие нас файлы. Ниже представлен реальный код, который использовался для решения поставленной задачи. Основой алгоритма было решение -- мы будем каждые пять минут просматривать папки на FTP и забирать все файлы, время создания которых отстоит от текущего не более чем на 5 минут import pysftp import sys import os import time #sftp connection information cinfo = {'host':'host.ru', username':'user', 'password':'password'} #folder with tickets local_dir = '\\\\cname\\files\\appdata\\source' #get local time local_time = time...
1 год назад
Начала программирования
Мое программирование началось осенью 80-го года в рамках семестрового курса состоящего из одних практических занятий. Пожилая дама призвав нас не быть обезьянками, а думать, кратко ознакомила с необходимым набором языковых конструкций и предложила решить небольшую вычислительную задачу. Как оказалось, такой путь весьма эффективен. Вот и мы им воспользуемся. Все программы работают с переменными. Переменная всегда хранит значение и может иметь имя и тип, который ограничивает возможные значения переменной. Например, переменная может хранить только числа или только строки. "Всегда хранит значение"...
1 год назад