|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Частенько сталкиваюсь с такой проблемой, что один класс представляет собой контейнер / провайдер и отдаёт свои данные в объектах другого класса. Вот пример нерабочего примера как бы хотелось это видеть. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Другими словами часть методов являются публичным интерфейсом, а другую часть хочется огородить от доступа извне но в тоже время разрешить доступ из Provider-а. Хотелось бы услышать как вы решаете эти проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 14:19 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikron, ну вроде ж наоборот, Provider нужно делать Nested, например Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 14:31 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
LR, Когда один nested class то можно вывернуть на изнанку. Но такой метод не работает если их несколько. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 14:43 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikron, несколько провайдеров или несколько контейнеров? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 14:47 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Если провайдер порождает некие классы и хочет их в дальнейшем эксклюзивно контролировать, он может при создании передавать внутрь этих классов некую инъекцию, которая позволит ими управлять, которая, разумеется, не будет доступна другим классам. Но тут надо быть аккуратным - не допустить утечки памяти из-за обратных ссылок. Но задача выглядит странноватой, лучше рассматривать конкретную задачу, а не абстрактный пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 15:00 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Как вариант (если я правильно понял проблему): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 15:27 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikron, А что требуется получить на выходе? Какая реальная задача решается? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 16:30 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
LRmikron, несколько провайдеров или несколько контейнеров? Провайдер или контейнер один. Несколько нестед классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 18:31 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.ProНо задача выглядит странноватой, лучше рассматривать конкретную задачу, а не абстрактный пример. Возьмём простой пример с одним нестед классом. пусть мы разрабатываем простой LRU cache. Для внутреннего представления используем нестед класс Node в который поместим ключ типа К, значение V и счётчик попаданий HitCounter. Счётчик может читать каждый, менять только контейнер. Для хранения элементов кеша мы реализуем односвязный список на классе Node, добавим ему элемент Next. Доступ к нему должен иметь только контейнер. Про методы я фантазировать не буду. Надеюс на этом премере можно разобрать проблему. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 19:04 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Если доступ к счетчику имеет только контейнер, значит и доступ к узлу предоставляет только контейнер (иначе на каком основании он будет крутить этот счетчик). А раз это так - нет никакой необходимости засовывать счетчик внутрь узла, это будет свойство оболочки узла или вообще параллельная структура. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2019, 23:27 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikronНадеюс на этом премере можно разобрать проблему.Нет)) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 01:18 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.ProЕсли доступ к счетчику имеет только контейнер Доступ на изменение - да, только контейнер. Статистика о работе кэша публична. Доступ на чтение не ограничен. Shocker.ProЕсли доступ к счетчику имеет только контейнер, значит и доступ к узлу предоставляет только контейнер (иначе на каком основании он будет крутить этот счетчик). А раз это так - нет никакой необходимости засовывать счетчик внутрь узла, это будет свойство оболочки узла или вообще параллельная структура. Я не не совсем понял ваши рассуждения. В примере основной пункт в том что контейнер представляет наружу для для каждого узла публичный интерфейс, по которому можно читать <Key, Value, HitCounter>. Покажите наброски кода, как вы предлагаете ограничить видимость. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 10:37 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikronВ примере основной пункт в том что контейнер представляет наружу для для каждого узла публичный интерфейс, по которому можно читать <Key, Value, HitCounter>.В твоем примере как раз-таки не так. Контейнер предоставляет не "для каждого узла", а он предоставляет сам узел, а узел уже предоставляет <Key, Value, HitCounter>. А вот если делать как ты сказал, то тогда вопросов не будет - контейнер будет предоставлять набор <Key, Value, HitCounter readonly > по запросу на получение узла, а сам узел станет внутренней сущностью контейнера ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 10:43 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.PromikronВ примере основной пункт в том что контейнер представляет наружу для для каждого узла публичный интерфейс, по которому можно читать <Key, Value, HitCounter>.В твоем примере как раз-таки не так. Контейнер предоставляет не "для каждого узла", а он предоставляет сам узел, а узел уже предоставляет <Key, Value, HitCounter> Всё так: Узел с ограниченными правами доступа и есть публичный интерфейс. Слово "интерфейс" надо понимать здесь в широком смысле. Shocker.ProА вот если делать как ты сказал, то тогда вопросов не будет - контейнер будет предоставлять набор <Key, Value, HitCounter readonly > по запросу на получение узла, а сам узел станет внутренней сущностью контейнера Покажи кодом как ты это видиш. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 11:03 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikronПокажи кодом как ты это видиш.Я вижу так, что контейнер возвращает неизменяемую сущность (узел). Или ты хочешь, чтобы пока потребитель как-то использует узел, контейнер параллельно менял у него счетчик неожиданно для потребителя? А потребитель должен самостоятельно менять Key и Value у этого узла, а контейнер должен это как-то подхватывать? Я не понимаю пока, зачем нужна такая интерактивность в этом узле. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 11:13 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.ProИли ты хочешь, чтобы пока потребитель как-то использует узел, контейнер параллельно менял у него счетчик неожиданно для потребителя? Непонятно какими путями ты пришёл к "паралельно". Про многопоточность мы не говорили. А в однопоточном приложении непонятно как ты пришёл к "нежиданно". в однопоточном приложении это допустимо и даже желательно. Если консумент получил доступ к узлу а затем выполнил несколько запросов на поиск этого же элемента, то статистика должна быть корректно отражена. Shocker.ProА потребитель должен самостоятельно менять Key и Value у этого узла, а контейнер должен это как-то подхватывать? Ни потребитель не может их менять и ни контейнер: эти элементы для всех readonly. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 14:08 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
mikronЕсли консумент получил доступ к узлу а затем выполнил несколько запросов на поиск этого же элемента, то статистика должна быть корректно отражена.ну так при повторном запросе ему приходит новый узел с новой статистикой ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 14:14 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.ProЯ вижу так, что контейнер возвращает неизменяемую сущность (узел). Я понимаю что ты имееш в виду. Так конечно тоже можно, но имеет свои недостатки. Например при итерации создаётся много временных объектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 14:15 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Ну а решение я уже писал выше. Провайдер интегрирует в узел свой делегат, через который может менять статистику. Но тогда нужно следить за корректностью сборки мусора из-за обратных ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 14:18 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Послушаем, может ещё другие решения кто предложит. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 15:02 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
А если разбить на два проекта? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 15:07 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Еще вариант, как я бы сделал "спинным мозгом" если бы делал всё в одном проекте. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 15:15 |
|
Как ограничить доступ?
|
|||
---|---|---|---|
#18+
Worobjoff, Да, так тоже хорошо. SetCounter и SetName я бы сделал public. их никто всё равно не увидит. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2019, 15:27 |
|
|
start [/forum/topic.php?fid=20&msg=39862017&tid=1398805]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
158ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 286ms |
0 / 0 |