tag:blogger.com,1999:blog-8596733192274108952.post5052593867753514895..comments2024-03-12T06:00:18.305+02:00Comments on Programming stuff: Инкапсуляция и сокрытие информацииSergey Teplyakovhttp://www.blogger.com/profile/14300835272589262297noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-8596733192274108952.post-4869541885259255182016-09-19T22:38:46.447+03:002016-09-19T22:38:46.447+03:00>2) Увеличивается количество кода при написании...>2) Увеличивается количество кода при написании тестов, т. к. для получения инициализированного экземпляра приходится использовать AddSomething(), SetSomething() и пр. вместо инициализации свойств.<br /><br />В .NET как вариант можно делать свойства internal и с помощью атрибута InternalsVisibleTo открыть доступ для проектов с тестами. Я очень часто так делаю.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-83524473302327957052016-09-16T23:27:09.515+03:002016-09-16T23:27:09.515+03:00Алексей, спасибо за дополнения и отличную цитату.Алексей, спасибо за дополнения и отличную цитату.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-12307083012405700452016-09-16T23:03:01.542+03:002016-09-16T23:03:01.542+03:00Также где-то там же в этой книге высмеивалась идея...Также где-то там же в этой книге высмеивалась идея, когда делают члены класса приватными, но тут же открывают к ним доступ через set/get-методы. Я тут согласен. В таком случае сокрытием информации и не пахнет. :)Anonymoushttps://www.blogger.com/profile/12083366592733415297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-22069134185507748502016-09-16T22:59:15.744+03:002016-09-16T22:59:15.744+03:00Могу дополнить цитатой из книги "Growing obje...Могу дополнить цитатой из книги "Growing object-oriented software, guided by tests" (p. 49):<br />Encapsulation and Information Hiding<br />We want to be careful with the distinction between “encapsulation” and “information<br />hiding.” The terms are often used interchangeably but actually refer to two separate,<br />and largely orthogonal, qualities:<br />Encapsulation<br />Ensures that the behavior of an object can only be affected through its API.<br />It lets us control how much a change to one object will impact other parts of<br />the system by ensuring that there are no unexpected dependencies between<br />unrelated components.<br />Information hiding<br />Conceals how an object implements its functionality behind the abstraction<br />of its API. It lets us work with higher abstractions by ignoring lower-level details<br />that are unrelated to the task at hand.<br />We’re most aware of encapsulation when we haven’t got it. When working with<br />badly encapsulated code, we spend too much time tracing what the potential<br />effects of a change might be, looking at where objects are created, what common<br />data they hold, and where their contents are referenced. The topic has inspired<br />two books that we know of, [Feathers04] and [Demeyer03].Anonymoushttps://www.blogger.com/profile/12083366592733415297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-42631001682666974392016-09-07T08:50:01.165+03:002016-09-07T08:50:01.165+03:00Лично я для себя пришел к концепции "классы р...Лично я для себя пришел к концепции "классы работающие с базой отдельно, внешний контракт слоя работы с базой отдельно".<br />Я тоже довольно долго пытался делать "по книжкам", в которых ОРМ магическим образом избавляет нас от проблем с персистентностью. Но на практике это всегда разбивается о кучу проблем - для того чтобы держать какой-то баланс между доменной моделью и базой приходилось городить кучу неочевидных вещей типа хитрых маппингов и вот таких уступок для коллекций.<br />Так что в итоге решил что классы для "слепка базы" одни, но они internal и служат только для работы с базой и контекстом. А вот доменная модель уже public и я конвертирую их туда-сюда.<br />Попутно избавился от lazy (т.к. считаю что от него больше вреда чем пользы) и загружаю всё что надо явным образом. Или не загружаю, но это отображается на публичной модели.zloy denhttps://www.blogger.com/profile/06757705001123731799noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-80391489099362822782016-09-06T11:10:28.886+03:002016-09-06T11:10:28.886+03:00Согласен, что сокрытие информации увеличивает «кач...Согласен, что сокрытие информации увеличивает «качество» дизайна. Но жизнь вносит нюансы:<br /><br />1) EF для ленивой загрузки списка потребует свойства с интерфейсом ICollection (тут печальная рожица)<br /><br />2) Увеличивается количество кода при написании тестов, т. к. для получения инициализированного экземпляра приходится использовать AddSomething(), SetSomething() и пр. вместо инициализации свойств.<br /><br />Для себя использую сокрытие информации только для объектов и сервисов предметной области. Все же DTO делаю с публичными get/set.Anonymoushttps://www.blogger.com/profile/17399671297054680047noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-20330975000950284172016-09-06T09:18:52.520+03:002016-09-06T09:18:52.520+03:00Вот кстати у меня был жизненный пример как раз с ч...Вот кстати у меня был жизненный пример как раз с чтением конфигурации.<br />Мы сразу же выносили её в отдельные классы и всё было вроде бы хорошо (контракт был естественно синхронным).<br />А потом появилась необходимость использовать азуровский KeyVault, у которого асинхронные методы доступа. И вот тут начались большие проблемы, потому что тот человек который это сделал, просто взял и написал task.Result для того чтобы сохранить синхронный контракт. В итоге, была очень весёлая ситуация, когда наши сервисы стали наглухо падать через час работы (скорее всего во время обновления токена что-то лочилось). Хорошо еще что я подозревал где могла быть проблема и воткнул костыль для того чтобы оно всё работало (и даже угадал что это было именно там).<br />Хотелось потом переписать всё на нормальные async методы, но объём работы нас испугал - слишком много где использовались конфигурационные классы и не вышло так просто поменять всё. Так что, скорее всего этот быстрый хакфикс так и останется в проекте.zloy denhttps://www.blogger.com/profile/06757705001123731799noreply@blogger.com