Heim > Backend-Entwicklung > C++ > Ist die Verwendung benutzerdefinierter Delegaten in einer ICommand-Implementierung der beste Ansatz zur Vermeidung wiederholter Instanziierung?

Ist die Verwendung benutzerdefinierter Delegaten in einer ICommand-Implementierung der beste Ansatz zur Vermeidung wiederholter Instanziierung?

Barbara Streisand
Freigeben: 2025-01-20 17:21:11
Original
878 Leute haben es durchsucht

Is Using Custom Delegates in an ICommand Implementation the Best Approach for Avoiding Repeated Instantiation?

ICommand-Implementierung in MVVM: wiederholte Instanziierung vermeiden

Frage:

Um das wiederholte Erstellen von ICommand-Instanzen zu vermeiden, habe ich versucht, eine ICommand-Klasse mithilfe eines benutzerdefinierten Delegaten zu implementieren. Diese Klasse enthält zwei Delegaten: OnExecute (void-Delegat, akzeptiert Objektparameter) und OnCanExecute (bool-Delegat, akzeptiert Objektparameter).

Der Code lautet wie folgt:

<code class="language-csharp">public class TestCommand : ICommand
{
    public delegate void ICommandOnExecute(object parameter);
    public delegate bool ICommandOnCanExecute(object parameter);

    private ICommandOnExecute _execute;
    private ICommandOnCanExecute _canExecute;

    public TestCommand(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod)
    {
        _execute = onExecuteMethod;
        _canExecute = onCanExecuteMethod;
    }

    //...
}</code>
Nach dem Login kopieren

Dieser Ansatz funktioniert, ich habe jedoch Zweifel an der Plausibilität seiner Umsetzung und ob es einen besseren Weg gibt.

Lösung:

Dieser Ansatz ist dem häufig verwendeten RelayCommand-Muster sehr ähnlich, RelayCommand ist eine ausgereiftere und optimierte Lösung.

RelayCommand-Implementierung:

<code class="language-csharp">public class RelayCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public RelayCommand(Predicate<object> canExecute, Action<object> execute)
    {
        _canExecute = canExecute;
        _execute = execute;
    }

    //...
}</code>
Nach dem Login kopieren

Verwendung:

<code class="language-csharp">public class MyViewModel
{
    private RelayCommand _doSomething;

    public ICommand DoSomethingCommand
    {
        get
        {
            return _doSomething ??= new RelayCommand(
                p => this.CanDoSomething(),
                p => this.DoSomeImportantMethod());
        }
    }
}</code>
Nach dem Login kopieren

Verwenden Sie eine Null-Zusammenführungszuweisung (??=), um sicherzustellen, dass RelayCommand Instanzen nur einmal erstellt werden.

Referenz:

Durch die Verwendung von RelayCommand oder einer ähnlichen vorgefertigten Implementierung können Sie die zusätzliche Komplexität benutzerdefinierter Delegaten vermeiden und saubereren, zuverlässigeren Code erhalten.

Das obige ist der detaillierte Inhalt vonIst die Verwendung benutzerdefinierter Delegaten in einer ICommand-Implementierung der beste Ansatz zur Vermeidung wiederholter Instanziierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage