このコンテキストでの「外部」とは、「ユーザーが観察できる」ことを意味します。ユーザーは、アプリケーションの場合は人間であり、パブリックAPIの場合は他のプログラムです。
したがって、メソッドMをクラスAからクラスBに移動し、両方のクラスがアプリケーションの奥深くにあり、変更によるアプリの動作の変化をユーザーが観察できない場合、それを正しくリファクタリングと呼ぶことができます。
OTOH、他の高レベルのサブシステム/コンポーネントがその動作によって動作を変更したり、変更のために破損した場合、それは実際に(通常)ユーザー(または少なくともログをチェックするシステム管理者)に観察可能です。または、クラスがパブリックAPIの一部である場合、MがBではなくクラスAの一部であることに依存するサードパーティコードが存在する可能性があります。したがって、これらのケースはいずれも厳密な意味でリファクタリングされません。
コードのリワークをリファクタリングと呼ぶ傾向がありますが、これは間違っていると思います。
実際、それはリファクタリングがファッショナブルになることの悲しいが期待される結果です。開発者は長年にわたってアドホックな方法でコードのリワークを行ってきましたが、確かに根深い習慣を分析して変更するよりも新しい流行語を学ぶ方が簡単です。
それでは、外部の振る舞いを変えるリワークの正しい言葉は何ですか?
私はそれを再設計と呼びます。
更新
インターフェースに関する多くの興味深い回答がありますが、メソッドのリファクタリングを動かしてインターフェースを変更しませんか?
なにかの?特定のクラス、はい。しかし、これらのクラスは何らかの形で外の世界に直接見えるのでしょうか?彼らはの外部インターフェース(API / GUI)の一部で、あなたのプログラムの中にある、とないので-ない場合はプログラム -変更が行われていない外部の関係者によって観察がある(もちろん変更休憩何か、しない限り)。
:私はこれ以上の深い疑問があることを感じて、それ自体で独立したエンティティとして、特定のクラスが存在していますか?ほとんどの場合、答えはノーです。クラスは、より大きなコンポーネント、クラスとオブジェクトのエコシステムの一部としてのみ存在し、それなしではインスタンス化できず、使用できません。このエコシステムには、その(直接/間接)依存関係だけでなく、それに依存する他のクラス/オブジェクトも含まれます。これは、これらの上位レベルのクラスがないと、クラスに関連付けられた責任がシステムのユーザーにとって無意味/役に立たない可能性があるためです。
たとえば、レンタカーを扱うプロジェクトでは、 Charge
クラス。レンタルステーションのエージェントと顧客は個別の料金で多くのことを行うことができないため、このクラス自体はシステムのユーザーには使用できません。全体としてレンタル契約契約を処理します(これにはさまざまな種類の料金が含まれます) 。ユーザーは主に、これらの料金の合計に関心があり、最終的に支払うことになります。代理店は、さまざまな契約オプション、レンタル期間、車両グループ、保険パッケージ、追加アイテムなどに関心があります。これらは、(洗練されたビジネスルールを介して)現在の料金と最終支払いの計算方法を管理します。これらのうち。そして、国の代表者/ビジネスアナリストは、特定のビジネスルール、それらの相乗効果と効果(会社の収入など)に関心を持っています。
最近、このクラスをリファクタリングし、そのフィールドとメソッドのほとんどの名前を変更しました(標準のJava命名規則に従います。これは前任者によって完全に無視されていました)。またString
、char
フィールドをより適切なタイプに置き換えるためのリファクタリングをさらに計画enum
していboolean
ます。これらはすべてクラスのインターフェイスを確実に変更しますが、(私が正しく仕事をすれば)アプリのユーザーには表示されません。彼らは確かに電荷の概念を知っているにもかかわらず、個々の電荷がどのように表されるかを気にしません。ドメインコンセプトを表していない他の100のクラスを例として選択することもできたので、エンドユーザーには概念的にも見えなくなりましたが、コンセプトレベルで少なくともある程度の可視性がある例を選択する方が面白いと思いました。これは、クラスインターフェースがドメインコンセプトの表現にすぎず(実際には)、実際のものではないことを示しています*。概念に影響を与えることなく表現を変更できます。また、ユーザーは概念を理解しているだけです。概念と表現の間のマッピングを行うのは私たちの仕事です。
* そして、私たちのクラスが表すドメインモデルは、それ自体が「本物」の近似表現にすぎないことを簡単に追加できます...