Переглядаючи якийсь код, який я написав, я натрапив на наступну конструкцію, яка змусила мене задуматися. На перший погляд, це здається досить чистим. Так, у фактичному коді getLocation()
метод має трохи більш конкретну назву, яка краще описує, яке саме місце він отримує.
service.setLocation(this.configuration.getLocation().toString());
У цьому випадку service
є змінною екземпляра відомого типу, оголошеною в межах методу. this.configuration
походить від передачі до конструктора класів і є екземпляром класу, що реалізує певний інтерфейс (який мандатує публічний getLocation()
метод). Отже, this.configuration.getLocation()
відомий зворотний тип виразу ; конкретно в цьому випадку він є java.net.URL
, тоді як service.setLocation()
хоче a String
. Оскільки два типи String і URL не є безпосередньо сумісними, для встановлення квадратного кілка в круглий отвір потрібне певне перетворення.
Однак , в Відповідно до Закону про Деметрі , як цитується в чистому кодексі , метод F в класі C повинен викликати тільки методи на C , об'єкти , створені або передаються в якості аргументів е , і об'єкти проведені в змінних екземпляра C . Все, що є поза цим (остаточне toString()
в моєму конкретному випадку вище, якщо ви не вважаєте тимчасовим об'єктом, створеним в результаті виклику методу, і в цьому випадку весь Закон здається суперечливим) заборонено.
Чи є обґрунтовані міркування, чому такий виклик, як вище, з урахуванням перелічених обмежень, слід відмовити чи навіть заборонити? Або я просто надмірно нудотний?
Якби я реалізувати метод , URLToString()
який просто викликає toString()
на URL
об'єкт (наприклад, що повертається getLocation()
) , переданого їй у якості параметра, і повертає результат, я міг би обернути getLocation()
виклик в ній для досягнення точно такий же результат; Ефективно, я просто переміщу конверсію на крок назовні. Це зробило б це якось прийнятним? (Мені здається , інтуїтивно зрозуміло, що це не має жодних змін і в іншому випадку, оскільки все, що робиться, - це трохи перемістити речі. Однак, йдучи за цитатою літери Закону про Деметер, це було б прийнятно, оскільки я Тоді він буде працювати безпосередньо над параметром функції.)
Чи має щось значення, якби мова йшла про щось дещо екзотичніше, ніж запрошення toString()
стандартного типу?
Відповідаючи, майте на увазі, що зміна поведінки або API типу, яким є service
змінна, не є практичним. Також, для аргументації, скажімо, що зміна типу повернення getLocation()
також недоцільно.