Іс-шаралар мен делегаттар

Ескертпе

Қауымдастықтың қызығушылық топтары қазір Yammer-ден Microsoft Viva Engage-қа көшті. Viva Engage қауымдастығына қосылу және соңғы талқылауларға қатысу үшін Қаржы және операциялар Viva Engage қауымдастығына кіруді сұраңыз формасын толтырып, қосылғыңыз келетін қауымдастықты таңдаңыз.

Бұл мақалада X ++ тіліндегі оқиға терминологиясы мен кілт сөздер сипатталады.

Event-design үлгісін пайдаланып, кодыңызды модульдік әрі қайта пайдалануға болатын етіңіз. Метафора - бұл сөйлемдерді қалай қолданатынын түсіндіретін метафора. Бағдарлама орындалу кезінде маңызды нәрсе болғанда, басқа модульдер оны өңдеуі мүмкін. Бұл маңызды оқиғалар оқиғалар деп аталады. Оқиға орын алған кезде, бағдарлама оқиға туралы хабарландырушыға хабарландырушы оқиға туралы хабарландырулар жіберуі керек екенін айтады. Notifier хабарламаның жазылушысы болып табылатын барлық оқиға өңдеушілеріне хабарлама жібереді. Бағдарлама хабарлаушыға хабарламаларды жіберуді бұйырса, бұл процесс оқиға тудырады .

Делегатты кестеде, формада немесе сұрауҙа анықтай аласыз, тек класта емес.

Төмендегі кестеде оқиға метафорасын сипаттайтын терминдер көрсетілген.

Термин Сипаттамасы
Оқиға Қосымша модульдер оқиғаны өңдеуі керек бағдарламалық модульдегі маңызды оқиға.
Хабарландыру Оқиға туралы ақпаратты хабарландыруға жазылған барлық оқиға өңдеушілеріне жіберетін бағдарлама элементі.
Абонент Оқиға туралы хабарландыруға жазылатын бағдарламаның функциялары немесе әдістері.
Оқиға өңдегіші Оқиға туралы хабарлама жіберу әдістері. Тек дұрыс әдістемелік құралдар ғана іс-әрекетті жүргізе алады.

Бағдарламалық жасақтаманы пайдаланатын кілт сөздер

Төмендегі кестеде сөйлемдерді пайдалануды сипаттайтын кілт сөздер көрсетілген.

Кілт сөз немесе термин Код Сипаттамасы
Делегат delegate myDelegate(str information) {} Мәтін мазмұны бойынша мәтін мазмұнында көрсетілген мәтін мазмұнын көрсетеді. Қайтару түрі әрқашан бос болғандықтан, ол синтаксисте көрсетілмейді. Кір жуғыш заттың ішіне кіруге рұқсат етілмейді ({}А.Байтұрсынов).
Ð Ð°Ñ Ð� myClassInstance.myDelegate += eventHandler(otherClass.myInstanceMethod); eventHandler кілт сөзінің синтаксисі eventHandler X ++ функциясы болып табылады деген әсер қалдыруы мүмкін болса да, бұл функция емес. eventHandler кілт сөзі компиляторға әдістің өкілге жазылғанын айтады.
Өкілге жазылу немесе әдісті қосу myClassInstance.myDelegate += eventHandler(OtherClass::aStaticMethod); Кодта OtherClass::aStaticMethod статикалық әдісі делегатқа жазылады.
Өкілді шақыру myClassInstance.myDelegate("Hello"); Өкілге бұл қоңырау өкілдіктен делегатқа жазылған әрбір әдісті шақыруды сұрайды. Конкурсқа қатысуға өтінімдер конкурсқа қатысуға өтінімдерді қабылдау тәртібімен көрсетіледі. Өкіл келесі әдісті шақырмас бұрын бір жазылу әдісін аяқтау керек.

Мысал

Төмендегі код мысалы оқиғаны анықтау, оқиғаға жазылу және оқиғаны көтеру әдістерін екі класс арқылы көрсетеді. PointWithEvent класы жылжытылған делегатты анықтайды. Қозғалыс әдісі қозғалтылған делегатты шақырады, ол оқиғаға жазылған кез келген объектілерді хабарлайды. PointKeeper класы writeMove әдісін анықтайды және оны createAndMove әдісінде жасалған Pointданасының жылжытылған өкілі үшін оқиға өңдеушісі ретінде тағайындайды.

class PointWithEvent
{
    // Instance fields.
    real x;
    real y;

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    {
        x = _x;
        y = _y;
    }

    void move(real x_offset, real y_offset)
    {
        x += x_offset;
        y += y_offset;
        this.moved(abs(x_offset) + abs(y_offset));
    }

    delegate void moved(real distance)
    {
    }

}

class PointKeeper
{

    public void createAndMove()
    {
        PointWithEvent point = new PointWithEvent(1.0, 2.0);

        point.moved += eventhandler(this.writeMove);

        point.move(4.0, 5.0);
        // Output is "9.0".
    }

    public void writeMove(real distance)
    {
        info(any2Str(distance));
    }

}

Оқиға өңдеушілері және алдын ала/кейінгі әдістер

Ескі X++-та метадеректерде белгілі бір әдістер әдіс орындалғанға дейін және кейін орындалатынын белгілей аласыз. Баспагер жазылушылардың не қоңырау шалатыны туралы ақпаратты жазып алды, бұл қоршаған ортада пайдалы емес. Енді жазылушыларға SubscribesTo атрибутын қосу арқылы код арқылы алдын ала және пост өңдеушілерді ұсына аласыз.

Алдын-ала және пост әдістерінің мысалы

[PreHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PreHandler(XppPrePostArgs arguments)
{
    int arg = arguments.getArg("i");
}

[PostHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PostHandler(XppPrePostArgs arguments)
{
    int arg = arguments.getArg("i");
    int retvalFromMethod = arguments.getReturnValue();
}

public int Publisher(int i)
{
    return 1;
}

Бұл мысалда Publisher деп аталатын жариялау әдісі көрсетілген. PreHandlerFor және PostHandlerFor атрибуттары арқылы екі жазылушы тіркеледі. Код айнымалыларға және қайтарылатын мәндерге қалай қол жеткізуге болатынын көрсетеді.

Бұл функция кері үйлесімділік үшін және қолданба кодында көптеген делегаттар болмағандықтан, маңызды бағдарлама оқиғаларын жариялау үшін қарастырылған. Pre және post өңдеушілер параметрлер қосылған немесе алынып тасталған, параметр түрлерінің өзгеруі, немесе әдістер басқа жағдайда шақырылмағандықтан оңай бұзылуы мүмкін. Атрибуттар сондай-ақ өкілдерге оқиға өңдеушілерді байланыстыру үшін қолданылады:

[SubscribesTo(
    classstr(FMRentalCheckoutProcessor),
    delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(
    FMRental rentalrecord, Struct rentalConfirmation)
{
}

    delegate void RentalTransactionAboutTobeFinalizedEvent(
        FMRental fmrentalrecord, struct RentalConfirmation)
{
}

Бұл жағдайда SubscribesTo атрибуты FmRentalCheckoutProcessor.RentalTransactionAboutToBeFinalizedEvent өкілі шақырылған кезде RentalFinalizedEventHandler әдісін шақыру керек екенін көрсетеді. Баспагер мен жазылушылар арасындағы байланыс атрибуттар арқылы жүзеге асырылатындықтан, жазылушылардың қай ретпен шақырылатынын анықтау мүмкін емес.