コピー/貼り付けパターンを修正する方法は?


15

私が働いている場所では、人々(コンサルタント)はできるだけ早く機能をリリースするよう迫られています。そのため、物事を正しい方法で行う方法を考えたり、何かを壊したくないために時間をかけすぎたりする代わりに、コードは異なるモジュールからコピーされ、修正されます。

コードベースは会社全体に公開されているため、これを防ぐのは簡単ではありません。多くの人々がこれに取り組んでいます。

混乱がすでにあるので、あまりにも壊さずにそれらの冗長性を削除する最良の方法は何ですか?


3
最も厄介なのは、コードが一部のサイトからコピー/貼り付けられ、コメントさえ削除されない場合です。だから、あなたは見つけることができます: "//そのカルロをありがとう" ...そしてあなたが彼らにそれを指すとき、彼らはただ笑って言ってください: "それを残しなさい!))"。それは専門的でも悲しいことでもありません!!!
CoffeeCode

2
コンサルタントだけでなく
AndersK

回答:


14

答えの一部はリファクタリングです。

まず、ユニットテストの作成を開始して、変更内容を誤って壊さないようにします。その後、設計の改善、重複の削除などを小さなステップで開始し、各ステップの後にユニットテストを実行し、テストのいずれかが失敗した場合は問題を修正し、簡単に解決できないほど大きな問題が発生した場合はすぐに元に戻します。

他の部分は教育です。

人々は悪いコードを残さないように教えられなければなりません。これは確かに長期的な戦いです。習慣や思考プロセスを変えるのは難しい(時には不可能なこともある)からです。ただし、それなしでは、リファクタリングを行うために絶叫する悪いコードの無限の供給を得続けるでしょう。

グループコードレビューを行って、良いコーディング習慣と悪いコーディング習慣に関する議論を開始し、前者のメリットを広げることができます。「このようなコードを書かなければならない」と言うだけでは十分ではありません。論理と確固たる事実で人々を説得する必要があります。同様に、「あなたは方法のこの作品は、コードベースの上に重複している場合のn 倍を、あなたはチャンスはバグがその方法で発見された場合、それはメソッドのコードの各コピーに固定されることがあるかと思いますか?」

あなたの会社はまた、コンサルタントのインセンティブと受け入れ基準修正する必要があるかもしれません-彼らがずさんなコードを書くことで逃げることができれば、彼らは確実により簡単な道を選び続けるでしょう。会社が長期的な保守性に関して「高速配信」を重視し続けている場合、何も変更されません。理解し、維持する。の省略のリファクタリングがあなたのクレジットカードに借金を集結のようなものです。あなたはしばらくそれで逃げることができます、しかしあなたがあなたの購入習慣と負債を積極的に管理していないならば、それは必然的にあなたの肩で崩れます。ソフトウェアプロジェクトの存続期間において、破産とはプロジェクトが保守不能になることです。既存のコードベースに新しい機能を追加するよりも、ゼロから書き直す方が簡単になります。または、ユーザーは劣ったレベルのサポートと機能にうんざりして、単に競争に切り替えます。


4
「まず、ユニットテストの作成を開始し、誤って変更内容を壊さないようにします。」うわー、そこにブレーキをかけます。SEサイトの誰もがこのラインを自分の答えにさりげなく投げる方法が本当に嫌いです。これは非常にを理解するの困難であり、提案するユーザーの99%がそうするように提案しているほどカジュアルではありません。

@Sergio Tapia-本当ですが、それなしではリファクタリングできません。2011年頃現実へようこそ
スコット・ホイットロック

1
@Sergio、レガシーコードのユニットテストが難しいということなら、私はこれ以上同意できませんでした。引用文を「最初に、単体テスト書くという骨の折れるストレスの多い作業を開始する必要があります...」と拡張できてうれしいです。ただし、単体テストが難しいので、それ、私は強く反対します(理論ではなく、実際の経験に基づいて)。レガシーコードを維持するための王道はありません。
ペテルトレック

9

@Peterのような教育の一環として、PMDのようなコピー&ペースト検出器を導入し、ビルドサイクルの一部として使用して、コーディング標準のこの部分を実施することができます。

プロジェクトのコーディング標準がこのパターンをカバーしていることを確認して、ディスカッションを開始するためのベースラインを用意してください。


1
いいね
ozz

請負業者の契約でコーディング標準の順守を要求することは可能ですか?
アルマン

1
@Alisonあなたが何でも好きなものに順守することを要求できます、あなたが前もって述べている限り、あなたは問題を抱えてはいけません。請負業者として、私が働いている会社が持っているあらゆる開発要件を順守していますが、そのうちの1つはコーディング標準に準拠しています。トランクに提出する前に、コードの確認もこの問題を解決する助けることができる
DBlackborough

ありがとう、あなたの投稿の後、Python / Java用のclonedigger.sourceforge.netも見つけました。
LennyProgrammers

@ G3Dは理にかなっています。作業するコーディング標準が好きですか?受け入れの形態として、コードレビューと私の問題は、請負業者として、私はコードが任意の理由(例えば政治、または予算の変更)のために拒否することができることを心配するだろうということです
アルマン

8

人々(コンサルタント)は、できるだけ早く機能をリリースするよう迫られていると感じる

あなたには技術的な問題はなく、社会的な問題があります。実際、管理上の問題があります。

コードベースは会社全体に公開されているため、これを防ぐのは簡単ではありません。多くの人々がこれに取り組んでいます。

「コードベースは会社全体に公開されています」は問題ではありません。関係ありません。

重要なのは、コピーアンドペーストのための管理報酬システムがあることです。根本的な原因は、人々がコピーアンドペーストに対して報酬を与えられている(つまり、支払われている、賞賛されている、昇進または延長されている)ことです。

文化を「可能な限り迅速に機能をリリースする」から「適切で十分にテストされたコードベースの変更を行うことに対する報酬」に根本的に変更しない限り、これを破ることはできません。

必ず

  1. 報酬を強化するマネージャーとともに、トップから始めます。現在のプラクティスを公開し、コストとリスクを文書化する必要があります。コストとリスクを削減する代替案を提案する必要があります。

  2. その組織での残りの在職期間について、容赦なく文書化し、コストとリスクを明らかにする必要があります。容赦ない。事実ベース。コストとリスク。毎週、コピーアンドペーストによるコストとリスクが増大します。

  3. あなたはマネージャーが彼らを良く見せ、あなたが無視される新しいアプローチを信用するのを助ける必要があります。

コピーアンドペーストを減らすことが非常に重要です。しかし、組織の文化を変えることは困難です。あなたは多くの事実を提供する必要があり、あなたはあなたに同意しないマネージャーに何度も何度も主張しなければなりません。


1
特に「マネージャーが見栄えを良くし、あなたが無視される新しいアプローチをマネージャーが信用できるようにする必要があります」ために+1。多くの場合、これは現実であることに注意してください:
PéterTörök11年

@PéterTörök:これをあきらめる人が多すぎます。彼らは、コピー/貼り付けによって引き起こされた問題に関する事実を収集しないか、何度も何度も経営陣に主張し続けません。
S.Lott

ここには、より深く非技術的な問題があることを知っています。しかし、誰も気にしないですぐにいつでも修正できる問題です。これは、回避する必要があるサードパーティライブラリのバグのようなものです。
レニープログラマー

@ Lenny222:あなたのコメントはほとんど意味がありません。「誰でも気にする人はすぐにいつでも修正できる問題です」は質問から明らかです。このコメントはどういう意味ですか?答えには何が欠けていますか?さらに何が必要ですか?
S.Lott

これは継続的な教育プロセスです。
JeffO

5

私はそれから腐り始めていたコードベースを今持っています。モジュールごとに10個以上の静的関数があり、それらは他のモジュールの同じ静的関数と基本的に同じでした。それぞれがただ振る舞っ可能な限り迅速に物事を行うために、異なる、新しい化身を保証します。

今日、私はさらに別の機能を追加する必要があり、それ以上利用できませんでした。新しいライブラリを作成し、100 +関数をビットフラグに基づいて動作をわずかに変更する10個のリエントラント関数に組み合わせてから、一連のテストを作成して、そのライブラリへの変更が他に影響しないことを確認しました。

合計時間:4時間。必要に応じて20時間のマラソンに行く準備ができていたので、どんどん大きくなって混乱を抑えていたのに驚いた。ボーナスとして、一連のヘッダー依存関係の問題を後で修正する方が簡単でした。さらに、私たちの所有物の多くはリンク用の静的オブジェクトになっているため、以前よりも多くのソースコードにアクセスできる顧客を提供できます。

私のアドバイス:弾丸を噛んで、それが本当に悪くなる前に今混乱するリファクタリング。おそらくあなたが思うほど長くはかかりませんが、念のために新しいブランチを自分用に作成してください。

さらに、基本的な問題修正しながら、コピー/貼り付けで機能を公開できます。完了したら、貼り付けたものをリッピングして、代わりに新しいライブラリを使用します。


好奇心が強い、同一のものを見つけましたか?
JeffO

@ジェフ-はい、いくつか。しかし、ほとんどのパターンは、複製が誰かが少し違うことをするために(必要な)ライブラリコードを望んでいた結果であることを示していました。
ティムポスト

5

これまでの回答に同意します。あなたがすべき:

  • 単体テストを作成する
  • リファクタリング
  • 教育する
  • コーディング標準に力を入れ、違反を検出する

しかし他方では、人々がコピーペーストをコピーして修正する原因を調べる必要があります。

  • 多くの場合、コードは適切に再利用できない可能性があります
  • 人々は彼らが使用できるライブラリがあることを知らないかもしれません
  • ライブラリコードは十分に一般的ではない可能性があり、独自のバージョンを作成することは既存のライブラリを使用するよりもはるかに簡単です
  • 適切なバージョン管理(ソース管理ではない)戦略が存在しない場合があり、汎用ライブラリを変更すると、他の多くのアプリケーションもテストされる可能性があります。

したがって、再利用を容易にするために必要なコピー/貼り付けパターンを停止すると思います。

  • ライブラリを発見しやすく文書化する
  • ライブラリをすべてから独立させる
  • 適切なバージョン管理戦略を考える
  • 後方互換性を確保する
  • ライブラリの簡単な拡張性について考える

フレームワーク設計ガイドラインを読む

お役に立てれば。


3

「有害と見なされるコピーペースト」という強い態度があります。良いと思いますが、行き過ぎです。2つのメソッドまたはクラスの類似点と相違点を発見するための演習としてのコピーペースト- 三角測量プロセスのステップとして-私は健康だと思います。しかし、完全な三角測量(コピーペーストによって生じる重複を排除する)をやめることは、本当に有害です。

その微妙な態度を使用して、開発者に「それは悪いことではありません!」ではなく、「それは不完全です。リファクタリングを完了するために私と協力してもらえますか?」


2

私はここで同じ問題に関心があり、それに対する私の考え方は、それを前もって回避しようとせず、悪化しすぎた場合にリファクタリングすることです。

私が現在startetで作業しているモジュールは、別のモジュールのコピーとして、今では異なる必要があるものすべてを変更しています。これが完了し、新しいモジュールが完成したら、元のモジュールと比較し、どの部分が多かれ少なかれ変更されず、ライブラリ、抽象親クラスなどに移動する必要があるかを見つけます。


2

責任者は誰でも責任を負います。1人の人がすべてのコード行をレビューすることは期待できませんが、標準と時間枠を設定します。

請負業者(またはプロジェクトの短期的な人)は、最初に作業を行った場合にのみ報酬を受けるという立場に置くことができます。できるだけ早くそれを成し遂げるインセンティブがあります。コピーされたコードを変更する必要はないかもしれませんが、変更された場合は変更されません。

自分の時間に修正するように強制することもできます。その後、彼らは最初からそれを始めますが、それから物事を成し遂げるために時間の取るに足らない量を取ります。AmmoQには、問題を引き起こしているものをリファクタリングするという正しい考えがあると思います。


同意する。問題は、プロジェクトマネージャーには、適切に設計されたコードに対してより多くの支払いをするインセンティブがないということです。1週間無駄にする必要がある場合は、請求されません。
LennyProgrammers

@ Lenny222-あなたが努力できるのは、コードを改善するためにプロジェクトのスポットを選ぶことです。PMのセールスポイントは、彼らが戻ってくるまで(通常は足の間に尻尾を置いて)発生せず、「心配する必要はありません。柔軟性を高めるためにその部分を構築しました」 。最終的に、物事を行い、クライアントの期待を管理する正しい方法があることを知るかもしれません。誰もが高品質のソフトウェアを望んでいますが、実際にどれだけの費用がかかるかを知っている人はほとんどいません。
JeffO

1

コピー/貼り付けコードを排除する唯一の方法は、(IMHO)コードレビューであり、コードをチェックする人(またはそれ以上)があり、コピー/貼り付けアクションに由来するコードを見つけた場合、プログラマーにリファクタリングを許可します。


1

提案されているように、これは主に組織の問題です。人々を教育することから始めてみてください(あなたの位置の上の直接管理層を忘れないでください)。電車に1人か2人乗せて、ウイルスを広めるのに非常に役立ちます。大多数がこれが良い考えだと思うとき、それを説明させて、それがこのようにとどまることを保証するためにレビューを紹介しようとします。これは非常に時間がかかる退屈なプロセスですが、すぐには変更できません。最初は余分な時間がかかりますので、経営陣が長期目標を知ってサポートすることが重要です。

@Anders K.レビューは、練習を適切に保つための良い手段です。人々にコードの記述を強制するとき、彼らはそれを信じないので、多くの摩擦が生じます。できる限り早く、彼らは古いハビットに戻ります。勢いをつけるには、教育から始めるべきだと固く信じています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.