ReSharper 2026.1 Help

アルゴリズムの複雑さを軽減し、モジュール性を高める

ちょうどすべての開発者は、クラス内の他のメソッドと絡み合っていた、実際には判読不能な単一のアルゴリズムで複雑なアルゴリズムを使用している状況にありました。 例: 方程式を解くための汎用クラスがあるとします。

public class EquationSolvers { public static Tuple<double, double> Quadratic(double a, double b, double c) { double disc = b*b - 4*a*c; if (disc < 0) throw new ArgumentException("Cannot solve equation with complex roots"); double sqrt = Math.Sqrt(disc); return new Tuple<double, double>( (-b + sqrt) / (2 * a), (-b - sqrt) / (2 * a)); } // other solvers here }

上記の方程式ソルバーはハードコーディングされているため、別のソルバーに置き換えるには、すべてのインスタンスを手動で置き換える必要があります。 まずは、これを別のクラスに切り出しましょう。 これを行うには、 別の型に移動リファクタリング F6 を使います:

ReSharper によるモジュール性

次に、メソッドを移動するクラスを指定する必要があります。 懸念をよりよく分離するために、 QuadraticEquationSolver という別のクラスを選択します。

ReSharper によるモジュール性

メソッドを移動したので、判別式の計算も別に分けてみましょう。 これは簡単です ― 判別式の計算を選択し、 メソッドの抽出リファクタリング Control+Alt+M を実行します:

ReSharper によるモジュール性

これで、新しいメソッドに名前を付けるだけです。

ReSharper によるモジュール性

そしてそれは終わった:

private static double CalculateDiscriminant(double a, double b, double c) { return b * b - 4 * a * c; }

ここで、しばらくしてから、2 次方程式のより安全なソルバーを見つけたとします。 プログラムに組み込むには、まず抽象基本クラス QuadraticEquationSolverBase を作成する必要があります。 リファクタリング メニュー Control+Shift+R で利用可能な 「スーパークラスの抽出」リファクタリング リファクタリングを使用します。

ReSharper によるモジュール性

表示されるダイアログでは、どのメンバーが上に昇格されるかを選択します。 CalculateDiscriminant メソッドのみが必要です。

ReSharper によるモジュール性

Calculate() メソッド(以前は Quadratic() と呼ばれていました)の抽象定義を追加し、次の基本クラスを補完します:

public abstract class QuadraticEquationSolverBase { protected double CalculateDiscriminant(double a, double b, double c) { return b*b - 4*a*c; } public abstract Tuple<double, double> Calculate(double a, double b, double c); }

また、 QuadraticEquationSolverBase の実装はコード内のライフタイムマネージャーによって処理されることを前提に、 static キーワードを削除しました。 その結果、ReSharper は QuadraticEquationSolver クラスの名前が変更された Calculate メソッドに override キーワードを追加するよう通知します:

ReSharper によるモジュール性

二次方程式ソルバーのより安全なバージョンを見つけたとしましょう。 実装しましょう。 まず、基底クラスで 派生型の作成 コンテキストアクション を使用します:

次に、このタイプのメンバーを実装するように求められます。

最後に、基本クラスの CalculateDiscriminant() メソッドを使用して実装を提供します。

class SafeQuadraticEquationSolver : QuadraticEquationSolverBase { public override Tuple<double, double> Calculate(double a, double b, double c) { double disc = CalculateDiscriminant(a, b, c); if (disc < 0) throw new ArgumentException("Cannot solve equation with complex roots"); double q = -0.5*(b + Math.Sign(b)*disc); return new Tuple<double, double> (q/a, c/q); } }

そして終わった ! 現在、2 次方程式ソルバーは簡単に使用でき、その構成とインスタンス化は通常 IoC コンテナーによって処理されます。

2026 年 6 月 12 日