morfizm (morfizm) wrote,
morfizm
morfizm

Инициализация в конструкторе

Обнаружился баг такого плана (C#):

Было a = new C(value); class C { C(type value) { field = value; ... } ... }
Изменили на a = new C() { field = value }.
А внутри конструктора (где-то в середине кода) было такое: if (field == null) { field2 = false; } Соответственно, всё сломалось, т.к. member initialization апплаится только после того, как конструктор отработал.

Мораль: если объект конструируется по-разному (выполняется разный код), в зависимости от начальных значений параметров, то следует создавать объект невалидным, и вынести логику инициализации в метод Init() (или ApplyOptions() как в appender'ах log4net'а). Кроме, пожалуй, тривиальных и очевидных случаев. Тогда таких багов не было бы как класса.

Вообще, парадигма умных конструкторов с параметрами, довольно ущербна и обычно хорошо работает только в случае, когда этих параметров всего один или несколько, они очевидны и естественны (о них можно догадаться по названию класса), и кода в конструкторе очень мало.
Tags: software development
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 28 comments