kudashevs
Новичок
Вопрос навеян давними размышлениями о дефолтном поведении объекта при неправильно проинициализированных опциях (массив каких-то параметров, которые где-то внутри разбираются, но они не настолько критичны, чтобы быть выделенными в отдельные значимые параметры).
Например, у нас имеется какой-то сервис с дефолтным поведением. У данного сервиса есть набор опций, который влияет на поведение сервиса. Набор опций довольно большой и мы не планируем проверять их все на входе (в идеале все таки должны, но нам или лень, или давят обстоятельства или мы не хотим усложнять процесс инициализации), потому что не факт, что ими всеми этими опциями будут активно пользоваться. Однако в месте конкретного использования мы какую-то "защиту на дурака" ставим, на всякий случай. Итак, пользователь передает неправильно заданную опцию (вместо поля требующего массив передается строка, вместо булевого значения передается мусор). От этого сервиса зависит дальнейшая работа какой-то большой системы, при этом мы точно знаем, что при дефолтном поведении система отработает как надо, однако не совсем так как ожидает пользователь (самый простой пример, письмо все таки отправится, но не с тем заголовком). Но ничего критичного для нас при дефолтном поведении не произойдет и убытков мы не понесем.
В данном случае есть несколько вариантов поведения:
- все таки следовать всем заветам защитного программирования и проверять все опции досконально при инициализации и не давать возможность создать объект хоть даже с малейшим подозрением на неправильные данные, пусть это усложнит инициализацию, зато нам не надо будет делать какие-то базовые проверки в местах использования (однако какие-то проверки в местах использования все равно останутся, потому что опции могут иметь какую-то логику)
- проверять не досконально, но в случае явного несоответствия сообщить пользователю (исключение, ошибка это не важно), что переданный им параметр не соответствует нашим ожиданиям и упасть в момент инициализации
- проверять не досконально, но в случае явного несоответствия сообщить пользователю (исключение, ошибка это не важно), что переданный им параметр не соответствует нашим ожиданиям и упасть в месте использования неправильной опции, тем самым указав место, где она была неправильно задействована
- сообщить пользователю (нотис, логирование тоже не важно), что переданный им параметр не соответствует нашим ожиданиям в момент инициализации и выполнить дефолтное поведение
- сообщить пользователю (нотис, логирование тоже не важно), что переданный им параметр не соответствует нашим ожиданиям в месте использования неправильной опции и выполнить дефолтное поведение
- выполнить дефолтное поведение не сообщая ничего пользователю (пусть сам разбирается, почему получил дефолтное поведение, надо RTFM прежде чем использовать чужой сервис)
Вопроса тут возникает два:
- какое поведение вы ожидаете в идеале (например, вы являетесь владельцем какой-то системы и используете данных сервис в качестве зависимости в приложении)?
- как на самом деле обстоят дела в реальности и какое поведение вы реализуете в своих проектах (при условии что надо вчера и времени на вылизывание кода нет)?
P.S. Буду очень признателен если при ответе вы потратите дополнительные 2-3 минуты и укажете, каким из принципов или какими принципами/техниками (например, инкапсуляция или так требует защитное программирование) вы пользуетесь принимая то или иное решение. Если еще поделитесь ссылками на какие-то запомнившиеся материалы или подскажете что дополнительно почитать, будет вообще шикарно
Например, у нас имеется какой-то сервис с дефолтным поведением. У данного сервиса есть набор опций, который влияет на поведение сервиса. Набор опций довольно большой и мы не планируем проверять их все на входе (в идеале все таки должны, но нам или лень, или давят обстоятельства или мы не хотим усложнять процесс инициализации), потому что не факт, что ими всеми этими опциями будут активно пользоваться. Однако в месте конкретного использования мы какую-то "защиту на дурака" ставим, на всякий случай. Итак, пользователь передает неправильно заданную опцию (вместо поля требующего массив передается строка, вместо булевого значения передается мусор). От этого сервиса зависит дальнейшая работа какой-то большой системы, при этом мы точно знаем, что при дефолтном поведении система отработает как надо, однако не совсем так как ожидает пользователь (самый простой пример, письмо все таки отправится, но не с тем заголовком). Но ничего критичного для нас при дефолтном поведении не произойдет и убытков мы не понесем.
В данном случае есть несколько вариантов поведения:
- все таки следовать всем заветам защитного программирования и проверять все опции досконально при инициализации и не давать возможность создать объект хоть даже с малейшим подозрением на неправильные данные, пусть это усложнит инициализацию, зато нам не надо будет делать какие-то базовые проверки в местах использования (однако какие-то проверки в местах использования все равно останутся, потому что опции могут иметь какую-то логику)
- проверять не досконально, но в случае явного несоответствия сообщить пользователю (исключение, ошибка это не важно), что переданный им параметр не соответствует нашим ожиданиям и упасть в момент инициализации
- проверять не досконально, но в случае явного несоответствия сообщить пользователю (исключение, ошибка это не важно), что переданный им параметр не соответствует нашим ожиданиям и упасть в месте использования неправильной опции, тем самым указав место, где она была неправильно задействована
- сообщить пользователю (нотис, логирование тоже не важно), что переданный им параметр не соответствует нашим ожиданиям в момент инициализации и выполнить дефолтное поведение
- сообщить пользователю (нотис, логирование тоже не важно), что переданный им параметр не соответствует нашим ожиданиям в месте использования неправильной опции и выполнить дефолтное поведение
- выполнить дефолтное поведение не сообщая ничего пользователю (пусть сам разбирается, почему получил дефолтное поведение, надо RTFM прежде чем использовать чужой сервис)
Вопроса тут возникает два:
- какое поведение вы ожидаете в идеале (например, вы являетесь владельцем какой-то системы и используете данных сервис в качестве зависимости в приложении)?
- как на самом деле обстоят дела в реальности и какое поведение вы реализуете в своих проектах (при условии что надо вчера и времени на вылизывание кода нет)?
P.S. Буду очень признателен если при ответе вы потратите дополнительные 2-3 минуты и укажете, каким из принципов или какими принципами/техниками (например, инкапсуляция или так требует защитное программирование) вы пользуетесь принимая то или иное решение. Если еще поделитесь ссылками на какие-то запомнившиеся материалы или подскажете что дополнительно почитать, будет вообще шикарно