2011-12-27 6 views
3

私はWinFormsスタイルで開発されたWpfapplicationを開発中です。私はこれを言っています -WinFormsスタイルで開発されたWPFアプリケーションをリファクタリング/再構築する方法

  • UserControlsがコードよりも多くの行を持っています(どの領域もなく、クラス全体に散在しています)。まったくの分離はありません。
  • 〜1000行のコードと、対応するViewModelのコードが1000行あるUserControls。
  • 多くのイベントハンドラを持つUserControls(一部は> 25)。
  • ネストされたクラスを持つUserControls。
  • INotifyPropertyChangedを実装し、DPを持つUserControls。
  • 未使用のクラス/コードがたくさんあります(コードで参照/使用されていますが、何もしません)。
  • さらに30個のMultiValueコンバータと40個のバリューコンバータがあります。
  • Converterインスタンスは、/ VMの背後にあるコードで頻繁に使用されます。
  • いくつかのMultiValueコンバータ
    • は、数百行のコード(400行までのコードを持つものはほとんどありません)です。
    • ビジネスロジックが内部にあります。
    • ViewModelインスタンスを作成します。
    • ネストされたクラスを持つ。
    • コードの背後にあるユーザーコントロールによって使用されるメソッドを公開します。
    • コードビハインドとビューモデルでユーザーコントロールが使用するプロパティを公開します。
    • 他のコンバータで使用される観測可能なコレクション/リストを返す静的メソッドを持つ&モデルを表示する。
    • イベントを公開し、UserControlおよびビューモデルによってサブスクライブします。
    • IDisposableを実装しています。

      <Editor:EditorControl.DataContext> 
          <MultiBinding Converter="{StaticResource EditorControlModelConverter}"> 
           <Binding 
            ElementName="UserControl" 
            Path="RefId" /> 
           <Binding 
            ElementName="UserControl" 
            Path="CollectionView.SelectedScenario" /> 
           <Binding 
            ElementName="UserControl" 
            Path="ParentComponentName" /> 
          </MultiBinding> 
      </Editor:EditorControl.DataContext> 
      

      と、この - -

      <ListView.ItemsSource> 
      <MultiBinding Converter="{StaticResource ItemsSourceInsertConverter}"> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorControl.ContextListEnabled" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorContainer.ParentComponent.Model.ModelList" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorContainer.ParentComponent.Model.CategoryModelList" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorContainer.ParentComponent.Model.ItemSortOrder" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="IsItemSourceMatrixInsertConverterSuspended" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorControlModel.IsUpdating" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorControlModel.ContextListEnabledInitialized" /> 
          <Binding 
           BindsDirectlyToSource="true" 
           ElementName="listView" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorControlModel" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorContainer.Plugin.FeatureManager.EditorCategoryFeatureEnabled" /> 
          <Binding 
           ElementName="EditorControl" 
           Path="EditorContainer.Plugin.FeatureManager.EditorMatrixFeaturesEnabled" /> 
      </MultiBinding> 
      
      このよう

    :コンバータはDataContextのとコントロール/リストビュー/データグリッドのItemSourcesを設定/作成するために広く使用されている

  • List on on ...あなたと同じ状況に直面していて、それをどう対処していますか?より良いパフォーマンスと保守性のために、この種のアプリケーションをリファクタリングするにはどのようなアプローチが必要ですか?


    アップデート:私たちは私たちのアプリケーションのパフォーマンスに満足していないと感じる - : -

    1. パフォーマンスアンドリューのQの

      回答 "我々はこれをリファクタリングする必要があるのはなぜ"機能性とユーザビリティを考慮して、より良いはずです。

    2. 優れた拡張性:私たちはまだ製品の初期段階であり、今後多くの新機能を追加する必要があることを認識しています。現在のコードベースを見ると、それは厄介に見え、古い機能を破壊する可能性があります。

    3. メンテナンスの改善:将来的に非標準/トリッキー/ハッキーコードを維持するのは難しくなります(これは、この製品が今後数年間続くと思われます)。

  • +3

    はい、私がやるべき最初のことは、「無能なWinForms開発者によって構築されたWPFアプリケーションをリファクタリングする」のような、意図的に炎症のタイトルを持つStack Overflowに関する質問を投稿することです。 *ああ待って... * –

    +1

    正直言って、私はここで "Winforms"開発としてタグ付けすることができます多くは表示されません。ビューモデル、コンバータ、バインディングを使用している場合は、明らかにMVVMを使用しようとしています。私は "私はする必要がありますか?"答えが「はい」の場合は、Resharperを購入してください。それはどこにも参照されていないすべてを表示します。すべて削除してから、リファクタリングを開始し、意味のあるところでクリーンアップしてください。 Resharperは、あなたから多くの努力なしに、あなたのために多くを行うことができます。しかしそれでも、あなたはあなたの前で多くの仕事をしているように見えます。 – Josh

    +1

    私はあなたがコンバータでイベントを公開する可能性があることを知りませんでした。 – Paparazzi

    答えて

    4

    私は質問をするでしょうなぜこれをリファクタリングする必要がありますか?答えが「標準に準拠している」、「見栄えが良い」、「開発チームが満足している」などと真剣に考え直したいと思っています。

    答えが「私たちはアプリケーションの変更/更新の困難さのためにビジネス上のニーズを満たすことができないため」という場合、有効なビジネス上の理由があります。

    私は最初の本能がそれをスクラップして書き直すことが多くのプロジェクトに取り組んできました。それらの多くは、私が実際にスクラップして書き直しただけで、元の開発者の半分の方法しか見つけられませんでしたが、決して考慮しなかった!

    同様に、書き直しやディープリファクタリングが強いビジネス上の理由で成果が上がった1〜2つの作業に取り組んできました。それにもかかわらず、常にこれらの変更を行うには痛い。

    So.結局のところ、もし私が強力なビジネス上の必要性のためにこれをしなければならないなら、おそらく、テストスクリプト(手動テスト)を作成するか、または自動テスト(UIまたはUNitテスト、それは重要ではない)あなたの申請。

    次に、Viewを順番に使用してViewModelsを作成し、機能をViewModelsに移動します。たとえば、依存関係プロパティ&をINotifyPropertyChangedをVMに移動します。

    私は依存性注入を見ます。それらのビューモデルに必要とされる依存関係を強化するためのStructureMapまたはカップリングを低く保つための他の方法

    これらのテクニックおよびその他については、Brownfield Application Development in .NETで概要を説明しています。

    最後に、私は、古いアプリケーションが行った機能の半分を行うわかりやすいコードで栄光を振り返ります。冗談で!この最後の部分は面倒だった、私はこれが非常に良いこと(リファクタリング)である多くの理由があると思うが、私はこれらの決定を軽く取らない苦い経験から学んだ。

    よろしくお願いいたします。

    +0

    おかげでアンドリュー、私は本当にあなたの肯定的な応答に感謝;これは私が探していた種類の応答です。 – akjoshi

    +0

    回答理由: 1.パフォーマンス - アプリケーションのパフォーマンスに満足できず、機能性とユーザビリティを考慮して、より良いものにする必要があります。 2.拡張性の向上:私たちはまだ製品の初期段階にあり、今後多くの新機能を追加する必要があることを認識しています。現在のコードベースを見ると、それは厄介に見え、古い機能を破壊する可能性があります。 3.保守性の向上:将来、標準に準拠していない/厄介なコードを維持するのは難しいでしょう。 – akjoshi

    +0

    akjoshiありがとうございました、追加情報をいただきありがとうございます。パフォーマンスに関して、ボトルネックはどういうものですか?説明的である。拡張性/保守性 - あなたに同意しますが、維持するのに苦労している実際のケーススタディはありますか?あなたのプロジェクトが早ければ、ブランケットの書き直しを考えても大丈夫です。コードを書き直すと、機能の半分、古い問題の半分になります。 –

    2

    私は未使用コードをコメントアウトすることから始めます。次に、ウィンドウを1つずつ書き換えます。

    それ以外の場合は、ブランチで作業し、しばしばチェックインして、既知の良い点に戻すことができます。

    無料の昼食はありません - ちょうど仕事に取り掛かり、それについて苦情を申し立ててください!

    +1

    +1の文句を言って停止する – Paparazzi

    +0

    ありがとうRQDQ;私は無料のランチはありませんが、他の人からアドバイスを受けることには害はなく、それは私の意図であり、他者にすべてが間違っていて何が悪くなるかを知らせることです。それがあなたの/他の時間を無駄にした場合、私はお詫び申し上げます。 – akjoshi

    関連する問題