1

私はいくつかのコードを調べて、問題や改善および変更できるものを見つけました (これは宿題ですが、この質問はタスク自体とは関係ありません)。コードの一部は次のとおりです。

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    Dim InSameCell As Boolean
    InSameCell = False
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
        InSameCell = True
    End If
    CheckIfSameCell = InSameCell
End Function

関数名に割り当てることができるのに、なぜInSameCellis 変数が作成されるのか理解できませんCheckIfSameCellか?

または、次のように return ステートメントを使用しますか?

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
        Return True
    End If
    Return False
End Function

If読みやすさを向上させるために、ステートメント内の式を直接返さないことは理解できます。

関数名に戻り値を割り当てても関数が終了しないことはわかっていますが、Return は終了しますが、それは単なる人のスタイルですか、それとも最初のバージョンに利点がありますか (IMO、2 番目の方が読みやすい)?

4

6 に答える 6

5

InSameCellの値が数回変更されてから返される可能性がある、より多くのチェックがあった可能性があります。then を使用returnすると動作が変わります。

作者は面倒な名前変更を避けたかったのかもしれません。関数の名前を変更したい場合、その関数の名前をそれ自身の本体内で何度も使用すると、置換する場所がたくさんありますが、変数を導入すると、名前を変更する場所が 1 つしかありません。 (IDE が適切にそれを行うことは知っていますが、VB6 ではそうではなく、習慣を破るのは困難です。)

たぶん、作者は を持たない VB6 にもっと精通していたのでしょうreturn

スタイルやポリシーの問題だったのかもしれません。

とにかく、私はそれを次のように書きます:

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
End Function
于 2012-05-01T17:09:26.590 に答える
4

結果を関数名に代入することは、VB6 で使用されていた古いスタイルであり、VB.NET では使用しないでください。使用してくださいReturn value

個人的にはスタイルのステートメントが嫌いです

If condition Then
    Return True
Else
    Return False
End If

conditionすでに戻り値を生成しているので、それらは単に愚かです! より良い:

Return condition

これは、GSerg が選択したソリューションでもあります。


誰も書かないだろう

If x + y = 0 Then
    Return 0
ElseIf x + y = 1 Then
    Return 1
ElseIf x + y = 2 Then
    Return 2
ElseIf x + y = 3 Then
    Return 3
...

しかし、式がブール型の場合、常にそれを行っている人もいます。条件が算術式に相当することに気づいていないのだと思います。それらは、数値を使用した算術ではなく、ブール値を使用した単純な算術です。

もう 1 つの誤解は、If ステートメントには のような比較が必要だというものIf x > 0 Thenです。ブール変数がある場合b、書き込みIf b = True Thenます。しかし、If ステートメントに必要なのは、ブール式によって与えられるブール値だけです。この式は、変数をクエリするのと同じくらい簡単です: If b Then.

なぜこれが機能するのですか?if bis Truethen yieldと if is then b = Trueyieldsのためです。だから、と言うのと非常に似ています。もちろん、これは単に と同じです。TruebFalseb = TrueFalseb = Truex * 1x

于 2012-05-01T17:28:43.437 に答える
2

2 番目の方法の方が読みやすいと思います。また、メソッドから戻ることも私の好みです。後者の欠点を比較して考えることはできませんが、前者の場合はできます。メソッドが長くなり、誰かが Boolean フラグを設定するのを忘れた場合はどうなりますか? 微妙なバグが生まれます。さらに、書くコードも増えます。後者のアプローチでは、リターンがない場合、コードはコンパイルされず、コードも短くなります。

戻り値の型にローカル変数が必要になるのは、戻り値が最初に決定された後でルーチンが他の作業を行う必要がある場合だけです。あなたが投稿した例では、そうではありません。

Code Complete、第 2 版は 391 ページに同意します。

可読性を向上させる場合はreturnを使用する特定のルーチンでは、答えがわかったら、すぐに呼び出しルーチンに返したいことがあります。エラーを検出した後、それ以上のクリーンアップを必要としないようにルーチンが定義されている場合、すぐに戻らないということは、より多くのコードを記述する必要があることを意味します。


注:他の回答 [ 1、2 ]で述べたように、メソッドを単一のコード ステートメントに減らすことができます。またAndAlso、最初の部分が false の場合、早期に論理式を短絡することにより、評価を高速化するのに役立ちます。

Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth 
    AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
于 2012-05-01T17:07:21.613 に答える
0

戻り値と関数名への値の代入には、重要なことが 1 つあります。あなたが(何らかのねじれた理由で)そのようなものを書きたい場合

Public Function TestFunct() as Boolean
  Dim testVar as Boolean = True
  If testVar then
   TestFunct = True
  Else
   TestFunct = False
  EndIf
  'do more stuff here 
  ...
  TestFunct = False
End Function

常に false を返します。代わりに return を使用すると、実行が停止し、関数は正しい値を返します。

于 2012-05-01T22:14:26.403 に答える