TokugawaTakeshi / CrossPlatformOrganizerAppplication

0 stars 0 forks source link

ステート管理を確保 #35

Closed TokugawaTakeshi closed 1 year ago

TokugawaTakeshi commented 1 year ago

複数のコンポネントの間ステートを共有する課題です。 Vueだと、VuexとPiniaで、ReactだとReduxやMobXは同類です。

参考にしたのは下記のリンクの内容です。 https://qiita.com/yosgspec/items/3cf93e70a81805d70d29#blazor-17

using System;

public class AppState{
    public string[] books{get;private set;}=new string[]{};
    public DateTime? date{get;private set;}=null;

    public void setBooks(string[] books){
        this.books=books;
        NotifyStateChanged();
    }
    public void setDate(DateTime date){
        this.date=date;
        NotifyStateChanged();
    }

    public event Action OnChange;
    private void NotifyStateChanged()=>OnChange?.Invoke();
}

分析

setBookssetDateは余計の様な感じがします。 C#のゲッター・セッターはそのようなメソッドを作る必要を無くす為に導入されたはずです。

私の場合

課題のカード(TaskCard)をクリックしたら、課題のマネージャー(TaskManager、多数形のTasksManagerと間違えないように気を付けて下さい)に課題の詳細が表示されてほしいです。

Image

ステート管理を担当しているのはTasksSharedStateManagerクラスです。

internal sealed class TasksSharedStateManager
{

  private static Task? _currentlySelectedTask = null;
  public static Task? currentlySelectedTask
  {
    get => TasksSharedStateManager._currentlySelectedTask;
    set
    {
      TasksSharedStateManager._currentlySelectedTask = value;
      TasksSharedStateManager.NotifyStateChanged();
    }
  }

  public static event Action onStateChanged;

  private static void NotifyStateChanged() => TasksSharedStateManager.onStateChanged?.Invoke();

}

表示更新の為にonStateChangedNotifyStateChangedだけ十分だったら、静的フィルドでも稼働するべき論理です。 この場合、インスタンスを作る必要性は分かりません。

TasksManageronSelectTaskというメソッドはありますが、TasksSharedStateManager.currentlySelectedTaskを更新してもTasksManagementPageContentactiveTaskゲッターは更新されません。

Image

原因を知りたいです。 @problem/state_managementブランチで見てもらえませんか?

gummoni commented 1 year ago

プロパティについて

C#のプロパティのGet/Setはコンパイル時にゲッターとセッターが生成されるので、 ソースコードレベルでゲッターとセッターメソッドは作る必要は特にありませんね。 過去の流儀にそって、何かしらのコーディングルールで使い分けがある場合は明示的にメソッドを作ることがあります。 私のゲッターとセッターの書き方・使い分けは、 プロパティは、他の変数や外部に影響を与えない場合、他のパラメータを参照しているだけの時はプロパティで済ませて メソッドは、APIで問い合わせたり、連動して他のパラメータも書き変わる場合は専用の関数で実装しています。

表示が更新されない問題について 

まだ動作確認はしていない状態ですが、 TasksSharedStateManagerクラス内にパラメータが更新された時のNotifyStateChangedメソッドは定義されてますが、 TasksManagementPageContentに変更通知するStateHasChangedメソッドと関連付けられていないため currentlySelectedTaskプロパティの値が変更しても、画面側に変更通知が届いていない可能性があります。

具体的には、下記修正で画面に変更通知を伝える事ができるようになると見られます。 また、ページ切り替えた際、再度同じページを開くと変更通知を再登録してしまうので、 変更通知解除する処理を別途用意する必要があります。

Image

TokugawaTakeshi commented 1 year ago

@gummoni

解決です! ありがとうございます。