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
Barbara StreisandOriginal
2025-01-20 17:21:11878Durchsuche

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>

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>

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>

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!

Stellungnahme:
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