web-dev-qa-db-ja.com

メソッド名の先頭に「On」を使用する

私が観察したことから、「オン」という単語で始まるメソッドは2つのカテゴリに分類されます。

  1. イベントを定義する基本クラスは、派生クラスがイベントを発生させることができるように、名前が「On」で始まり、イベント名が続くprotectedメソッドを公開します。

  2. 基本クラスは、名前が「On」で始まるprotected virtualまたはprotected internal virtualメソッドを公開します。これは、そのメソッドのデフォルトの動作を置き換える必要がある派生クラスによってオーバーライドできます。

#1は簡単で合理的です。派生クラスがメソッドをオーバーライドできるようにすることで、派生クラスがメソッドを呼び出した場合にイベントが発生することが保証されます。

ただし、オーバーライドされたメソッドがbase.On...を呼び出さない限り、基本クラスの関連付けられたイベントまたは暗黙のイベントが発生するかどうかわからないため、#2には疑問が残ります。 protected internal virtualの場合、メソッドは他のクラスから呼び出すこともできます。

#2の1つの例はMicrosoft.EntityFrameworkCore.DbContextです。コード生成により自動的に派生クラスが生成される場合、2つのメソッドがあります:protected override void OnConfiguringおよびprotected override void OnModelCreating。どちらのメソッドも、生成された本体の基本クラスを呼び出しません。この場合、これらはprotected internalではなくprotectedであるため、基本クラスはこれらのメソッドをある時点で呼び出す必要があります。イベントがあるかどうかはわかりません。

#2のもう1つの例はSystem.Windows.Forms.Formです。 protected virtualなど、多くのprotected virtual void OnActivatedメソッドがあります。そのメソッドの説明は「System.Windows.Forms.Form.Activatedイベントを発生させます。」ですが、もちろんこれはメソッドがbase.OnActivatedを呼び出した場合にのみ発生します。

特定のメソッド名の先頭に「オン」という単語を使用するための明確な規則はありますか?常にイベントが関与している必要があり、そのイベント名は常にメソッド名の「On」の後に使用する必要がありますか?イベントが常にメソッドOn...に関連付けられている場合、APIのクライアントは、メソッドをオーバーライドするときにbase.On...を呼び出さないとどうなると思いますか?イベントが発生しないと彼らは想定できますか?後者が真である場合、Microsoft.EntityFrameworkCore.DbContext.OnConfiguringおよびMicrosoft.EntityFrameworkCore.DbContext.OnModelCreatingの自動生成コードが基本クラスを呼び出さないのはなぜですか?

1
rory.ap

慣習はOn____メソッドは、他の何らかのオカレンス(ブランクで説明)によってトリガーされるメソッドです。時々それは文字通りのC#イベントであり、時々そうではありません。 方法トリガーされるのは実装の詳細です。この名前は、実装の詳細ではなく、「これは_______の後にトリガー」のデザインを伝えることを目的としています。

7
Telastyn

接頭辞「on」は、コールバックとして使用する場合に主に使用されます。つまり、これらは直接呼び出されませんが、イベントが発生した後に呼び出されます。

たとえば、onClickと呼ばれるメソッドを作成すると、直接呼び出されませんが、ユーザーの操作が必要です。ユーザーがそのメソッドをクリックすると、特定のメソッドまたはアクションのみが起動されます。たとえば、次のメソッドでは、JavaScriptのイベントは次のようになります。

onchange HTML要素が変更されましたonclickユーザーがHTML要素onmouseoverをクリックしますユーザーがHTML要素onmouseoutの上にマウスを移動しますユーザーがHTML要素からマウスを離しますonkeydownユーザーがキーボードキーを押しますonloadブラウザがページの読み込みを完了しました

0
Ishan Shah