Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ваша функция гуд,но чем плохи функции обертки для каждого отдельного права ?
Тем более эти функции судя по названиям не проверяют права как таковые, вот если бы они например назывались hasInvitePermission, то другое дело. А так результат функции canInvite помимо наличия права у player может зависеть от других параметров.
Я бы оставил вашу функцию и поместил ее вызов во все остальные, ну и конечно изменил бы названия некоторых функции на более говорящие, в частности бы добавил к ним can, как сделано у canInvite, хотя может для меня они не говорящие из-за того, что я не владею предметкой проекта
Порочна сама идея в принципе. Большое количество однотипных методов делает класс слишком статичным. Вероятность появления новых полномочий, судя по всему, довольно велика, потому имеет смысл сделать один метод, проверяющий полномочия, и отдельно иметь список всех возможных полномочий. Я бы выразил этот список в Enum'е (они специально спроектированы для дальнейшего расширения). Опять же, меньше будет проблем с сериализацией и прочими неочевидными вещами.
С одной стороны я с вами согласен, но скажем вы удалили эти функции и оставили только свою hasPermission,
У вас везде по коду будут вызовы hasPermission(player, "caninvite") вроде все хорошо, но допустим в последующем потребуется изменить логику определения имеет ли игрок возможность делать инвайт (canInvite), скажем это будет еще зависеть от какого-либо атрибута игрока и вам придется ходить по всему коду и менять логику: hasPermission(player, "caninvite") && player->needAttribute
Вынеся все это в отдельные методы вы избавите себя от возможного геморроя, Также мне кажется что будет неплохо разнести эти функции и функции проверки прав по разным классам. Еще раз смотря на выложенный код, я думаю, что вашу функцию я поместил бы в другой класс и использовал ее внутри этих методов
Если нужна более мощная функциональность, используем аналог паттерна Command: передаём в универсальную функцию специальный объект (если использовать Enum, для этого потребуются минимальные изменения, не затрагивающие клиентский код). Пример:
Логика может быть разной и всю ее в одну универсальную функцию не поместишь, скажем если вам потребуется добавить возможность доступа на govnokod то логика может быть такой
вообще-то я предлагал вынести каждое полномочие в отдельный класс / элемент енума, и помещать всю логику туда. А функция будет лишь фасадом для вызова соответствующей логики. Тогда появляется легко комбинировать полномочия по необходимости:
На самом деле в Java меня вполне устроил бы первый вариант. Java скорее останавливаем меня от описанного гибкого и типобезопасного подхода, нежели подталкивает к нему (больше букв получится, чем следовало бы для такой простой идеи).
Тема открыта: проверяем привилегий - предоставляем соответствующие возможности.
Иначе не предоставляем никаких возможностей, либо не предоставляем возможностей редактирования темы, а, например, перемещение и удаление в соответствии с привилегиями.
Говоря короче - отталкиваться в первую очередь от состояния темы. А уж потом от привилегий пользователей.
Возможно пример с форумом не самый удачный, но он был выбран что пояснить разниму между привилегией и возможностью выполнить действие, что это не одно и тоже.
А по теме вашего коммента, если я вас правильно понял, то большой разницы не вижу, напишите вы так
if (theme->isOpen) {
canWrite = hasPermission("write");
}
canDelete = hasPermission("delete");
У нас шла речь маленько о другом, что выложенный в топике код имеет право на жизнь и что в одном случае он может быть и говном, а в другом нет. Я попытался показать ситуацию когда этот по моему мнению не будет ГК.
То есть, в принципе будет 3 блока.
тема открыта:...проверка привилегий...
тема закрыта:...проверка привилегий...
проверка привилегий не зависящих от состояния темы
Как-то так. Мне интересно послушать чужое мнение пока я не начал в учебных целях писать движок форума с помощью технологии JSP.
Только нужно не забыть на методы контроллеров @Secured('ROLE_USER') повесить и проверять внутри возможность добавления коммента. А то могут найтись умники, которые и без кнопки запостить смогут.
Напомнило:
Мужчина заходит в бар и заказывает стакан виски и шесть соломинок, соединяет соломинки в одну и через эту длинную соломинку начинает пить виски. Бармен недоуменно спрашивает:
- Почему вы так делаете?
- Мне доктор велел держаться подальше от спиртного.
Тем более эти функции судя по названиям не проверяют права как таковые, вот если бы они например назывались hasInvitePermission, то другое дело. А так результат функции canInvite помимо наличия права у player может зависеть от других параметров.
Я бы оставил вашу функцию и поместил ее вызов во все остальные, ну и конечно изменил бы названия некоторых функции на более говорящие, в частности бы добавил к ним can, как сделано у canInvite, хотя может для меня они не говорящие из-за того, что я не владею предметкой проекта
У вас везде по коду будут вызовы hasPermission(player, "caninvite") вроде все хорошо, но допустим в последующем потребуется изменить логику определения имеет ли игрок возможность делать инвайт (canInvite), скажем это будет еще зависеть от какого-либо атрибута игрока и вам придется ходить по всему коду и менять логику: hasPermission(player, "caninvite") && player->needAttribute
Вынеся все это в отдельные методы вы избавите себя от возможного геморроя, Также мне кажется что будет неплохо разнести эти функции и функции проверки прав по разным классам. Еще раз смотря на выложенный код, я думаю, что вашу функцию я поместил бы в другой класс и использовал ее внутри этих методов
Вариантов может быть много, Permission может быть интерфейсом с множеством реализаций и т.п. Мне такой вариант представляется более расширяемым.
Вы предлагаете инкапсулировать все эти знания в одной функции, а я в одном классе
fixed
Но если мы говорим о классе для проверки доступности какого-либо действия для пользователя то в принципе выложенный код нормален.
Привилегия есть а возможности нет.
Иначе не предоставляем никаких возможностей, либо не предоставляем возможностей редактирования темы, а, например, перемещение и удаление в соответствии с привилегиями.
Говоря короче - отталкиваться в первую очередь от состояния темы. А уж потом от привилегий пользователей.
Это всего лишь предположение. Я жеж студентота xD
А по теме вашего коммента, если я вас правильно понял, то большой разницы не вижу, напишите вы так
или вот так
У нас шла речь маленько о другом, что выложенный в топике код имеет право на жизнь и что в одном случае он может быть и говном, а в другом нет. Я попытался показать ситуацию когда этот по моему мнению не будет ГК.
тема открыта:...проверка привилегий...
тема закрыта:...проверка привилегий...
проверка привилегий не зависящих от состояния темы
Как-то так. Мне интересно послушать чужое мнение пока я не начал в учебных целях писать движок форума с помощью технологии JSP.
Мужчина заходит в бар и заказывает стакан виски и шесть соломинок, соединяет соломинки в одну и через эту длинную соломинку начинает пить виски. Бармен недоуменно спрашивает:
- Почему вы так делаете?
- Мне доктор велел держаться подальше от спиртного.