خوب جا داره من یه مشق به شما بدم!
فرض کنید یه سایت دارید، که توش چندین کار (action) مختلف میشه انجام داد. مثلاً سادهاش میشه این که میشه توش یه کاربر اضافه کرد، فهرست کاربرا رو دید، یه کاربر رو ویرایش کرد، و یه کاربر رو حذف کرد (عملیات CRUD).
پس تا اینجا یه کلاس داریم مثلاً به نام MyController که توش ۴ تا تابع بالا هست (برای سادگی کار، توابع رو static گرفتم):
public class MyController {
public static void createAction() {
...
}
public static void listAction() {
...
}
public static void editAction() {
...
}
public static void deleteAction() {
...
}
}
حالا میخوایم یه تابع route داشته باشیم که action رو به عنوان ورودی بگیره، و action مورد نظر رو انجام بده (تابع متناظرش رو فراخوانی کنه). این کار رو توسط Reflection میشه اینطوری انجام داد:
public void route(String action) throws Exception {
Method m = MyController.class.getDeclaredMethod(action + "Action");
m.invoke(null);
}
(خیلی سادهسازی توی کد انجام دادم (و یه سری از best practice ها رو نقض کردم) که بشه مثال رو راحت جلو برد، لطفاً خیلی توجه نکنید!)
تا اینجای کار همه چیز خوبه!
حالا فرض کنید توی این سایت میخوایم سطوح دسترسی و Access Control تعریف کنیم. نقشهامون هم از قبل مشخص هستند:
- admin: به تمام action هایی که گفتم دسترسی داره.
- operator: میتونه فهرست کاربرا رو ببینه و هر کاربری رو ویرایش کنه.
- guest: فقط میتونه فهرست کاربرا رو ببینه.
حالا میخوایم این سطوح دسترسی رو توی کد تابع route اعمال کنیم و اگه یکی با سطح دسترسی نامناسب اومد سراغ یه تابع، یه Exception خاص (مثلاً AccessDeniedException) پرتاب کنیم. یعنی تعریف تابع route به این صورت تغییر میکنه:
public void route(String action, String role) throws Expection {
...
}
خوب بسمالله! لطفاً این تابع رو پیادهسازی کنید و در جواب این پست بنویسید. (لطفاً دوستانی که جواب نهایی رو بلدن دخالت نکنن! پیشاپیش ممنونم!)