Berechtigungsabfragen vereinfachen?

beta20

Top Contributor
Hallo,

ich habe Zig-Attribute, die immer mit der gleichen Abfrage geprüft werden.

Java:
Permission createJobPermission(Job job, Permission jobPermission, Permission permission,
       String permissionObject) {

    // //////////////////
     // / DOWNLOAD /////
     // //////////////////
  
     if (jobPermission.getDownload()
         .equals(PermissionCheckController.NOBODY)) {
       permission.setDownload(PermissionCheckController.FALSE);
     }
     if (jobPermission.getDownload().equals(
         PermissionCheckController.EVERYBODY)) {
       permission.setDownload(PermissionCheckController.TRUE);
     }
     if (jobPermission.getDownload().contains(
         PermissionCheckController.AFTER_REGISTRATION)
         && permissionObject
             .equals(PermissionCheckController.VISITOR_CLASS)) {
       permission.setDownload(PermissionCheckController.TRUE);
     }
     if (jobPermission.getDownload().contains(
         PermissionCheckController.CUSTOMER)
         && permissionObject
             .equals(PermissionCheckController.CUSTOMER_CLASS)) {
       permission.setDownload(PermissionCheckController.TRUE);
     }

     if (jobPermission.getDownload().contains(
         PermissionCheckController.EMPLOYEE)
         && permissionObject
             .equals(PermissionCheckController.EMPLOYEE_CLASS)) {
  

}


Der Code (DOWNLOAD) wiederholt sich für jedes Attribut der Klasse.
Kann man das vereinfachen, sodass man diese Abfrage nur einmal hat und dann alle Attribute der Klasse so abfrägt?
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Genau die if-Bedingungen wiederholen sich 1:1?

Dann ist es ja klar das man diesen Code am besten in eine eigene Methode auslagert :)

EDIT: Bzw. die if-Abfragen welche überall gleich sind in eine eigene Methode auslagern. Spezifischere if-Abfragen welche nur vereinzelt vorkommen eben an der gewünschten Stelle.
 

Joose

Top Contributor
Ah ok du meinst es gibt wo genau den Code nur statt eben "getDownload" bzw. "setDownload" wird eben ein andere Attribut abgefragt/gesetzt? (Etwas mehr Code wäre hier vielleicht praktischer, damit man sieht wie es für 2 unterschiedliche Attribute ausschaut)

Ich würde das gar nicht vereinfachen sondern für jedes Attribut genauso hinschreiben. Mir würde jetzt auf die schnelle einfallen: Per Reflection kannst du alle Attribute bzw. deren getter/setter aufrufen.
Aber schön finde ich das nicht vor allem da es hier um Berechtigungen geht, da wäre es praktisch genau zu sehen was wie geprüft und gesetzt wird. Sollten Spezialfälle oder ähnliches eingebaut werden müssen für einige wenige Berechtigungen dann wird das nur unschön bei Reflection.
 

beta20

Top Contributor
Ok, ist jedoch bei 100 Berechtigungen ziemlich umständlich - dachte ich frage einfach mal nach, ob jemand eine andere Idee hat.
Bei Spezialberechtigungen gebe ich dir natürlich recht.
 

nvidia

Bekanntes Mitglied
Da der Beispielcode nicht vollständig ist (wo wird z.B. Job verwendet?) und auch kein Code für ein weiteres Attribut gezeigt wird kann man da nur ein wenig rumraten. Alles in Allem wirkt der Code aber nicht so richtig durchdacht. Wie dem auch sei, mit Java8 könnte man vll. folgende Richtung einschlagen, wenn denn die Methodensignaturen auf die FI's für Supplier und Consumer passen.

Java:
    Permission modifyPermission(String permissionObject, Supplier<PermissionCheckController> getter, Consumer<PermissionCheckController> setter) {
  
        if (getter.get().equals(PermissionCheckController.NOBODY)) {
          setter.set(PermissionCheckController.FALSE);
        }
        if (getter.get().equals(PermissionCheckController.EVERYBODY)) {
            setter.set(PermissionCheckController.TRUE);
        }
        if (getter.get().contains(PermissionCheckController.AFTER_REGISTRATION)
            && permissionObject.equals(PermissionCheckController.VISITOR_CLASS)) {
            setter.set(PermissionCheckController.TRUE);
        }
        if (getter.get().contains(PermissionCheckController.CUSTOMER)
            && permissionObject.equals(PermissionCheckController.CUSTOMER_CLASS)) {
            setter.set(PermissionCheckController.TRUE);
        }

        if (getter.get().contains(PermissionCheckController.EMPLOYEE)
            && permissionObject.equals(PermissionCheckController.EMPLOYEE_CLASS)) {
        }
    }
  
    Permission createJobPermission(Job job, Permission jobPermission, Permission permission,
            String permissionObject) {
        Permission jobPermission =
                modifyPermission(permissionObject, jobPermission::getDownload, permission::setDownload);
      
        //...
    }
 

Ähnliche Java Themen

Neue Themen


Oben