سؤال

هل هناك طريقة لتحديد طريقة، والتي يتم استدعاؤها في كل مرة أسميها للحصول عليها؟

لدي جهة اتصال كائن ولا أريد تعيين UpdateLastused ()؛ في حوالي 30 الحصول على أعضالي.

هل كانت مفيدة؟

المحلول

كنت قد اقترحت AOP ولكن إذا كان J2ME نحن نتحدث عن أنك على الأرجح أفضل حالا إدراج يدويا "OngetCalled ()" في كل من 30 مساكنا لديك ثم ترميز كل ما تحتاجه خلال هذه الطريقة. قد ترغب في تمرير اسم الطريقة التي يتم استدعاؤها (أو الممتلكات التي تم الوصول إليها) في حال كنت في حاجة إليها في المستقبل.

نصائح أخرى

بدلا من الوصول إلى Getter لممتلكاتك، يمكنك إنشاء Getter عام واحد يأخذ اسم العقار كمدخلات. يجب أن يكون نوع المرتجع كائن إذا كانت خصائصك هي أنواع مختلفة.

في هذا Getter العام، يمكنك استدعاء Getter الخاصية والطريقة المحدثة (). أن تكون آمنا جعل جميع الممتلكات betters خاصة.

يمكنك إضافة مكالمة إلى كل طريقة (مملة)، أو استخدام شكل من أشكال AOP (مثل Jewelj، أدناه للحصول على مثال) لتتناسب مع Getters من الكتابة واستدعاء الطريقة المحدثة ().

تحرير: أشار العديد من الأشخاص إلى 30 Getters هو رائحة رمز وإلغاء طريقة أخرى هي تأثير جانبي. البيان الأول هو مؤشر عادل، ولكن ليس قاعدة. يمكن أن يكون هناك العديد من الأسباب التي تحتوي على هذا النوع من النوع، دون مزيد من المعلومات التي سأتركها كنصائح للتحقق مما إذا كان بإمكانك فصل المسؤوليات إلى نوعين أو أكثر.

النقطة الأخرى حول الآثار الجانبية قد تكون أو لا تكون ذات صلة. هناك العديد من المخاوف الشاملة التي يجعلها تنطبق على أساليب Getter. على سبيل المثال تسجيل، المصادقة، والتخزين المؤقت. قد تكون طريقة المثال UpdateLastused () جزءا من استراتيجية التخزين المؤقت، لذا فإن النقد غير المؤهل للسؤال غير محلغ في رأيي.

مثال على كيفية تنفيذ المشاركة والمشورة في Jewelsj كما يلي:

package test;

public aspect TestAspect {
    /**
     * Match all getters of test.Contact and bind the target.
     */
    protected pointcut contactGetters(Contact contact) : 
        execution(* test.Contact.get*()) && target(contact);

    /**
     * Before execution of each getter, invoke the updateLastUsed() method
     * of the bound target.
     */
    before(Contact contact): contactGetters(contact) {
        contact.updateLastUsed();
    }       
}

هناك حاجة إلى شيء مثل AOP للقيام بذلك. لا أعرف مدى دعم جيد في J2ME غير هذه.

إلى جانب AOP، يمكنك استخدام java.lang.reflect.Proxy, ، أو التلاعب bytecode ...

ولكن ليس على J2ME

أوصي بالاتصال updatelastused () 30 مرة.

هذا يبدو وكأنه وظيفة للبرمجة المنحى للجانب (AOP).

تحديد جانب ينفذ لأي شيء يبدأ get*

تدعم Jewelj jewelj 5 الجديدة "جديد" استخدام التعليقات التوضيحية لتحديد نقطة الاتجاهات حتى تتمكن من التعليق على Getters الخاص بك للحصول على نقطة @Before تنفيذ جسم الطريقة.

استخدم تعبيرا منتظما لإلحاق مكالمة الأسلوب إلى رؤوس Getter.

يجد:

\w+ get\w+\s*\(\)\s*\{(\s*)

استبدل ب:

\0updateLastUsed();\1

تم اختبار هذه التعبيرات باستخدام Eclipse 3.5 (Galileo) باستخدام "استبدال الكل" في مربع الحوار "Find / استبدال".

لاحظ أن المحرر الذي تستخدمه يجب دعم مطابقة Multiline (أو عليك تمكينه). بالنسبة إلى Emeditor 8.05، كان علي تعديل سلسلة البحث لتكون:

\w+ get\w+\s*\(\)\s*\{\s*(\n\s*)

بحيث يتم مطابقة الخط الجديد صراحة. لا تزال سلسلة البديل كما هي.

يمكنك أن تفعل شيئا يتوهم، لكن هذا بصراحة، ولهذا السبب تمت إضافة وحدات الماكرو إلى المحررين، بحيث يمكنك تكرار رمز مملة بسرعة.

أود فقط أن أستند الطريقة التي سيتم استدعاؤها بواسطة جميع Jetters، ثم استخدم ماكرو لإنشاء المكالمة (إذا كانت هناك حاجة إلى تختلف عن طريق الطريقة). كل هذا يجب أن يتم ذلك مرة واحدة وبعد ذلك ننسى فقط ...

إليك وسيلة. الأمر كذلك، لكنك قد تفضله بالتكرار:

public class GetterTest extends TestCase {
    private static class Thing {
        public int  accessCount;
        private String  name;
        private int age;

        private <T> T get(T t) {
            accessCount++;
            return t;
        }

        public String getName() {
            return get(name);
        }

        public int getAge() {
            return get(age);
        }
    }

    public void testGetIncrementsAccessCount() throws Exception {
        Thing t = new Thing();
        assertEquals(0, t.accessCount);
        t.getName();
        assertEquals(1, t.accessCount);
        t.getAge();
        assertEquals(2, t.accessCount);
    }
}

من الواضح، بلدي الحصول على () هو مجرد زيادة AccessCount، وسوف تريد بعض السلوك الآخر، ولكن الفكرة موجودة هناك.

أود أن أقول سحق الكائن لاستدعاء الأسلوب المرغوب فيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top