3

私はまともな大規模なプロジェクトのリファクタリングに取り組んでおり、より良い標準化と開発の容易さのためにコードクローンを検索して削減することに興味があります。

「完全一致」で表示され続けるコードスニペットがあります(Visual Studio 2012の「コードクローンの検索」機能を使用)。

ここにあります:

                End If
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Using
End Using
Return Nothing

基本的に、私には似たような機能がたくさんあります(構造は似ていますが、実際の機能は似ていません)。これらはすべて次のようなもので開きます。

Const sql As String = ...
Using cn As SqlConnection...
    Using cmd As SqlCommand(sql,cn)
        ... Maybe add some SqlParameters
        cn.Open()
        ... Something with cmd.Execute...

今、私は最初のコードブロックが多くの多くのメソッドで同一であることを認識していますがそのコードを引き出し、一度記述して、その機能が必要になるたびに呼び出す方法を見つけることができません。制御フローが多すぎるように思われます。

そのため、これを修正する方法に困惑しています(Microsoftが「クローンコード」として識別したため、これを「修正」できると想定しているだけです)。

私は、同じタイプのこと(テーブルからカウントを返す、最上位の値を返すなど)を実行し、SQLによってのみ実際に異なる少数の関数を作成するという方針に沿って何かを考えています。実行されます。ただし、パラメータ(タイプと数)が異なる場合があるため、これは少し注意が必要です。

何かご意見は?

4

3 に答える 3

2

私はそれらについては気にしません。あなたの常識的な第一印象は正しいです。技術的に言えば、構文は複数回繰り返されますが、実際にはロジックやアルゴリズムの繰り返しではありません。それは、その繰り返しを減らす方法がないということではありません。そうすることによって、コードのデザインが悪くなる可能性があります。

たとえば、すべてのセットアップとティアダウンを実行する単一のメソッドを作成してから、実際に接続を使用して作業を行う途中のメソッドを呼び出すことができます。

Public Function PerformDbTask(task As IMyDbTask)
    Using cn As SqlConnection...
        Using cmd As SqlCommand = cn.CreateCommand()
            Try
                cn.Open()
                task.Perform(cmd)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Using
    End Using
    Return Nothing
End Function

しかし、あなたは本当に何を得ましたか?おそらくそれほど多くはありませんが、それでも多くの柔軟性を失っています。ですから、あなたがやろうとしていることにそのようなデザインが実際に必要でない限り、私は存在しない問題を解決しようとして時間を無駄にしないでしょう。

于 2013-01-02T16:50:28.533 に答える
1

ビルダーパターンを実装するクラスを作成できます。これは、次のようになります。

Dim list =
    SqlBuilder.Query("SELECT ...")
              .WithConnection("...connection string...")
              .WithParameter(userName)
              .WithParameter(lastTrackId)
              .RetrieveTopRows(10)
于 2013-01-02T16:44:40.080 に答える
0

問題は、コード構造に一致するクローン検出器ではなく、トークンシーケンスに一致する(したがって、表示したブロックの終わりのシーケンスに一致する)クローン検出器を使用していることです。トークンシーケンス技術的にはクローンですが、興味深いクローンではありません。トークンクローン検出器は、このような多くの「誤検知」クローンを生成しますが、これは単に時間を無駄にします。

トークンシーケンス検出器を構築する方が簡単です。そのため、MSStudioにトークンシーケンス検出器を組み込みました。より優れた検出器が必要な場合は、Studioの外に出る必要があります。

抽象構文木に一致するクローン検出器を調べる必要があります。この種の誤検知は発生せず、(単一トークンのパラメーターではなく)複雑なパラメーターを持つクローンを見つけることができます。

また、何かがクローンとして識別されたという理由だけで、それをリファクタリングすることは必ずしも容易ではない、または可能ではないことも理解する必要があります。あなたが持っている言語は、その場合を処理するのに十分に強力な抽象化メカニズムを持っていないかもしれません。

于 2013-01-02T18:00:58.467 に答える