Покинул форум
Сообщений всего: 86
Дата рег-ции: Сент. 2010
Помог: 0 раз(а)
Мне прислали сделать тестовое задание из одной конторы. Я его сделал, но их не устроил результат. Помогите. Я не понимаю почему....
Вот задание:
Цитата:
Написать класс (или группу классов) для возможности логирования определенных сообщений.
- Возможность писать логи в stdout, mysql, файл по выбору. (Выбор осуществляется для всей системы логирования)
- Предусмотреть настройки mysql, пути до файла логирования
- Логи должны содержать:
* Дату и время события (в формате YYYY-MM-DD HH:MM:SS)
* Сообщение логирования (строка, массив, объект, исключение)
Код должен быть написан на языке PHP без использования фреймворков и сторонних библиотек.
Обязательно использование объектно-ориентированного подхода.
Архитектура программы должна быть масштабируема (возможность расширения функционала с минимальными правками существующего кода).
Я написал класс три класса для каждого типа логирования. Привожу код для MySQL
Они ответили что нет объекто-ориентированного подхода. Почему? Я не пойму, что они хотят
Bio man
Отправлено: 17 Июня, 2016 - 01:53:47
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
karamba пишет:
Почему?
потому что его нет.
в задании четко было сказано как надо делать.
во первых нужно выделить сущности.
- Logger: базовый абстрактный класс или интерфейс.
- StreamLogger: производный от Logger для записи логов в поток. В твоем случае это stdout.
- DBLogger: производный от Logger для записи логов в БД.
- FileLogger: производный от Logger для записи логов в файл.
StreamLogger принимает поток как параметр конструктора (в твоем случае php://stdout), открывает его и по завершению программы закрывает (в деструкторе).
DBLogger принимает параметром конструктора либо внешний объект для работы с БД (пусть будет PDO) либо принимает параметры для подключения к БД, и создает объект PDO сам.
Я бы предпочел первый вариант, он более оптимален в плане расширения. Тут вылезает полиморфизм - мы сможем подменить объект PDO на любой другой производный от PDO, а не хардкодим класс в логере.
FileLogger по сути лишний, так как есть StreamLogger, который может работать и с файловыми потоками.
Плюсом было бы написать логгер в соответствии с PSR-3, так как многие помешаны на PSR, и скорее всего посчитают плюсом.
И обязательно почитай PSR-1 и PSR-2, так как твой код ужасен.
Успехов!
T1grOK
Отправлено: 17 Июня, 2016 - 11:29:48
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
Для подобных вещей очень кстати использование паттерна Chain of responsibility.
----- Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Bio man
Отправлено: 17 Июня, 2016 - 13:51:41
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
T1grOK пишет:
Для подобных вещей очень кстати использование паттерна Chain of responsibility.
имхо это переусложнение. в задаче сказано, что писать логи нужно 1 логгером, что делает паттерн неприменимым в данной ситуации.
T1grOK
Отправлено: 17 Июня, 2016 - 16:19:34
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
Bio man пишет:
что делает паттерн неприменимым в данной ситуации
Все применимо - цепочка из одного звена. Но в любой момент количество звеньев можно нарастить, в чем вижу плюс - предусмотрительность к расширению возможностей.
----- Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
LIME
Отправлено: 17 Июня, 2016 - 19:06:44
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Bio man пишет:
StreamLogger принимает поток как параметр конструктора
Bio man пишет:
DBLogger принимает параметром конструктора либо внешний объект для работы с БД
тогда уж лучше принимать всем DTO
например объект конфига
чтоб уж интерфейс не плясал в разные стороны (Добавление)
karamba пишет:
$mysqli = new mysqli
я после этого тут же расхотел отвечать когда первый раз вопрос увидел))
karamba пишет:
Дата рег-ции: Сент. 2010
karamba попрактикуйся еще ...рано профессионально кодить
Bio man
Отправлено: 17 Июня, 2016 - 21:45:16
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
интерфейс интерфейсом а конструктор конструктором. одно другому не мешает. пусть конструкторы отличаются, не вижу в этом проблемы. тем более, код станет понятнее, если конструктор будет принимать понятные параметры (поток, PDO, параметры БД), нежели универсальный DTO (если я правильно понял, что ты имел в виду под DTO).
LIME пишет:
например объект конфига
тут не соглашусь. как раз наоборот, компоненты должны объявляться в конфиге и конфигурироваться приложением при запуске, т.е. сам объект (логгер) ничего не должен знать о конфиге.
karamba попрактикуйся еще ...рано профессионально кодить
это уж точно. (Добавление)
T1grOK пишет:
Все применимо - цепочка из одного звена. Но в любой момент количество звеньев можно нарастить, в чем вижу плюс - предусмотрительность к расширению возможностей.
YAGNI. Когда будет потребность - будем рефакторить, иначе это лишнее переусложнение. Тем более это 1 компонент, добавил класс, добавил по методу в логгеры и в путь.
karamba
Отправлено: 19 Июня, 2016 - 12:49:30
Гость
Покинул форум
Сообщений всего: 86
Дата рег-ции: Сент. 2010
Помог: 0 раз(а)
Bio man пишет:
karamba пишет:
Почему?
во первых нужно выделить сущности.
- Logger: базовый абстрактный класс или интерфейс.
- DBLogger: производный от Logger для записи логов в БД.
DBLogger принимает параметром конструктора либо внешний объект для работы с БД (пусть будет PDO) либо принимает параметры для подключения к БД, и создает объект PDO сам.
Успехов!
Попробовал сделать как вы сказали. Посмотрите пожалуйста, оцените.
Я только не понимаю для чего нужен общий абстрактный класс. Я тоже думал, что нужно замутить что то связанное с наследованием. Но просто если этот супер класс убрать, то ничего не измениться, будет все также работать, значит он никак не влияет на функционал. Для чего он нужен?
Если конструктор класса DBLogger будет принимать внешний PDO объект, то наверное не будет учтено задание, которое гласит, что необходима настройка на БД. А так получится, что об настройке на БД должен будет позаботиться создатель этого внешнего PDO, а не мой класс.
Стоит ли делать перегрузку конструктора или это лишнее? Надо ли сделать деструктор для закрытия PDO или он и так закроется при уничтожении экземпляра класса?
throw new Exception('Mysqli comment error: '.$this->mysqli->connect_error);
}
}
publicfunction write()
{
$stmt=$mysqli->prepare('INSERT INTO log (text) values (?)');
$stmt->bindValue('s',$this->text);
return$stmt->execute();
}
}
class stdoutLogger extends Logger
{
// ...
}
$fileLogger=new FileLoger('./error.log');
$fileLogger->log('случилась беда');
$fileLogger->write();
$mysqlLogger=new MysqlLoger('user','pass');
$mysqlLogger->log('ойойой');
$mysqlLogger->write();
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
karamba
Отправлено: 19 Июня, 2016 - 17:38:38
Гость
Покинул форум
Сообщений всего: 86
Дата рег-ции: Сент. 2010
Помог: 0 раз(а)
Да, вытащить сериализацию в базовый класс наверное можно, чтобы был в нем какой то смысл.
Я так понял, что использовать mysqli это уже не модно, надо через PDO.
И метод log лучше, чтобы вызывался прямо в write, чтобы ради одной записи не использовать два метода.
Почему если такого файла на диске нет, то просто не создать его?
Bio man
Отправлено: 19 Июня, 2016 - 17:42:11
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
Что это за хрень с __construct0 итд?
karamba пишет:
Я только не понимаю для чего нужен общий абстрактный класс.
Покинул форум
Сообщений всего: 86
Дата рег-ции: Сент. 2010
Помог: 0 раз(а)
Bio man пишет:
Что это за хрень с __construct0 итд?
karamba пишет:
Я только не понимаю для чего нужен общий абстрактный класс.
для полиморфизма. в таком случае мы работаем с любым логгером, будто он является абстрактным логгером.
Почитай основы ООП, такие вещи ты должен знать прежде чем говорить что твое ООП - ООП
https://www.youtube.com/user/pro100fox2/playlists
Всмысле за хрень с __construct0 итд? Это так реализована перегрузка конструктора. Насколько я понял в PHP нет обычной перегрузки конструктора.
Как будет использоваться полиморфизм в данном случае? В моем абстрактом классе нет ни одного поля или неабстрактного метода. Если мы создадим экземпляр каждого типа логирования и запишем в массив. Будем массив перебирать и вызывать метод logAdd(), то он будет одинаково работать и при существовании базового класса и без него.
Viper
Отправлено: 19 Июня, 2016 - 21:05:25
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.