ほとんどのプログラマーはコードをコピーして貼り付けますか?[閉まっている]


48

誰かのコードをカット&ペーストすることは、自分で書くよりも長い目で見れば時間がかかることを非常に早い段階で学びました。あなたが本当にそれを理解しない限り、私の意見では、カットアンドペーストのコードにはおそらく解決するのに悪夢のような問題があります。

誤解しないでください。他の人のコードを見つけて、そこから学ぶことが不可欠ですが、アプリに貼り付けるだけではありません。私たちは、書き換え概念を我々のアプリに。

しかし、私はカットアンドペーストをする人のことを常に聞いています。他の人からのコメントもあり、それが一般的な慣行であることを示しています。

それで、ほとんどのプログラマーはコードをカット&ペーストしますか?


10
方法を知っていても、とにかくコードサンプルを検索してベストプラクティスを見つけることがよくあります。コードを読み取れると、見つけたものが計画よりも優れているかどうかをすぐに判断できます。
ニコール

ごく最近、カット&ペーストに関する質問がありました。ぜひチェックしてみませんか?
ナウルグル

私が理解すれば。
ジョニー14

回答:


46

2つの一般的なケース:

あるプロジェクトから別のプロジェクトへ:

ほとんどのプログラマは、この能力でコードをカットアンドペーストします。以前のプロジェクトや何かをオンラインで見つけて、正確にコピー/貼り付けするか、コピー/貼り付けして変更する場合があります。このプラクティスは通常は問題ないと思います。これは、実証済みのコードである場合に特に便利です。(例:正常に機能した過去のプロジェクトのユーティリティオブジェクト、または変更がほとんど必要ないブログのユーティリティオブジェクトのようなもの)。これが悪い可能性があるのは、理解できないコードをコピーしているとき、コードが貧弱な場所、または貼り付けているコードよりもはるかに優れた代替ソリューションがある場所です。

同じプロジェクト内: 通常、同じプロジェクトにコピーして貼り付けることはお勧めできません。これは、コピーされるコードがどこかのメソッド/クラスにあり、繰り返し呼び出されるべきであるという悪臭です。これにはいくつかの例外がありますが、一般的にプログラマーは「コピーしているこのコードをパラメーター化する方法はありますか?」と考えるべきです


5
一般に、これは、ソフトウェアライセンスなどの改ざん防止コードの場合のように、アンチパターンを必要とするコードを記述している場合を除き、当てはまります。
ロブパーキンス

+1ええ、私はこれらの両方を行いました。私は長い間同じプロジェクト内からコードをカットアンドペーストしていません(ただし、ログに記録されたバグを取り戻すために極端なプレッシャーの下でそれを行うことはめったにありません)。ユーティリティクラスについては、プロジェクト間コピーは完全なファイルのコピーに分離されました。
ジョンマッキンタイア

2
データベースコードを書くとき、私は通常、その一部を新しい関数にカットアンドペーストし、望ましい結果を得るためにsql自体を変更し、データベース呼び出しを行うためのいくつかの前提条件を再入力する必要はありません。一般的に私は両方の発言に同意しますが。
クリス

1
@Chris:その中心部をコピーして修正することは、単にそのまま貼り付けることとは大きく異なります。
ローレンペクテル

1
@Loren Pechtel:それにもかかわらず、コードをコピーして貼り付ける行為がまだ含まれています。
クリス

37

ほとんどのプログラマーはそれをしますが、それはあなたがすべきことを意味しません

プログラミングのマントラの1つは、「コードをコピーして貼り付けると、何か間違ったことをしている」ということです。基本的に、DRYです。

コードの再利用とは、コードを繰り返し実行するのではなく、リソースとしてコードを使用することであることは明らかだと思います。コードをコピーして自分のコードを貼り付けることもありますが、ほとんどの場合、ボイラープレートコードまたは実際に似ているコードで終わります。

その後、そのコードにもう少し時間を費やした後、次のようになります。

  • 成分(参照:関心事の分離
  • 私はリフレクションに頼って、物事をよりシンプルに、よりクリーンに、そしてより簡単に再現できるようにすることができます。
  • より良い設計、それが機能する場合でも、レッスンを学んだ後にもう一度やり直してみませんか?
  • 抽象化し、ライブラリコンポーネントに変え、重複したコードを削除できるパターン

クライアント/ボスは気にしないので(少なくとも直接かつ短期的に)コードをコピー&ペーストするべきかどうかは議論の余地がありますが、同じ結果で終わる可能性がありますが、問題は本当に起こりますバグ、モジュール性の喪失、そして最終的にはメンテナンスの地獄につながります。

すべきこと:できるだけ早くリファクタリングする

あなたがそれをコピー&ペーストしていなくても自分のコードであっても、たとえそれが機能していても、完璧なコードを書く人はいません。リファクタリングの対象とその理由...自分でリファクタリングしなくても、メンテナにとって幸福と完全なフラストレーションの違いになる可能性があります。

最終的には、コピーして貼り付けても、最終的には適切なコードで終了します。

良いコード

XKCD経由


15
「リファクタリング」が「リファクタリングネバー」に変わることや、さらに悪いことには「他のSUCKERがリファクタリングして修正できるほどホットショットであるが、ほぼ間違いなくコードを修正する」ことがよくあります。私は前もってそれをすることを信じています、さもなければ明日のようです-それは決して来ません。
すぐに

1
@quickly_now-日時:「他のSUCKERがリファクタリングして修正できるほどホットなショットです」と言っていますが、私はそれらのジャークをどれほど嫌いなのかを表現できません。
ジョンマッキンタイア

ちょっとジョン。私はあなたを聞く。私は人生の何年もその吸盤に費やしていました...何が起こっているのかを本当によく理解するために真夜中まで半分のお金を払って汗をかきました(そして、がらくたコードの大きなスラブを書き直しました)他の何か。はぁ。
すぐに

1
チームでのより多くの人々は、より多くの「リファクタリングは、後に」これまで私が見ることができるよう、「決してリファクタリング」となり:/
wildpeaks

8

私が立ち往生し、問題を解決するためのものを探して、私が望むことをするコードの有用なスニペットに出くわすとき、私はそれを自然にコピーします。時にはそれの要点だけです。次に、ニーズに合わせて変更します。これは、私が専門家ではないもの(現在、Objective-C)を掘り下げるとより頻繁に起こります。

私は常にコードから何かを学ぶのに時間をかけるので、私にとってそれは学び、車輪の再発明を避けるための素晴らしい方法です。


4
私はいつも「良い開発者は怠け者だ」と言ってきました。他の誰かがすでにそれを行っている場合、私は車輪を再発明しません。しかし、私はそれを小さく保ちます...数行以上のコードをコピーすることはなく、完全に理解できないことは決してしません。
morganpdx

私は他の人から学ぶためにすべてですが、特定の問題を探している場合を除いて、他の人がやったことを頭で包むだけで、最初からそれを行うよりも時間がかかりますか?(クラスなどの機能の完全なユニットではなく、「コード」について話していることに注意してください。)
ジョンマッキンタイア

@John MacIntyreはそうかもしれませんが、通常、小さなコードスニペットを開くと、満足するまでそれを成形します。とにかく、多くの場合、(機能、より汎用、改善、最適化などに)適応させる必要があります。
マーティンウィックマン

@John:コードのスニペットは、物事を行う方法を示すそれらの部分を提供します。もちろん、カットアンドペーストします。しかし、Martinが指摘しているように、そのコードが何をしているのかを学んでください。名前がわからない特定のメソッドを検索するのにより多くの時間を費やします。言葉の意味がわからないとき。辞書で調べます。定義は100%明確です。しかし、使用サンプルはどのくらいの頻度で見ますか?コード例は、辞書の使用例に似ています。MSDNには、使用サンプルが常に含まれているわけではなく、不完全な場合もあります。
IAbstract

6

ここでは、他の人のコードのコピー/貼り付けについて説明します。個人のライブラリから自分の作品の一部を取得するのは、公正なゲームです。私はそれらを知っており、定義によって理解しています。

私がコードを「カットアンドペースト」する最も頻繁な状況は、特定の問題があり、それを解決するブログ投稿に遭遇したときです。ほとんどの場合、ソリューションを自分のプロジェクトに再入力します(結局、ブログ作成者のスタイルで書かれているはずです)。それは実際には私のコードではありませんが、そのシナリオでそれを使用するのは悪くありません。

外に出てメソッドやシステム全体をつかんでそのままプロジェクトに貼り付けて、それを完了と呼ぶのは理解できないことです。先日StackOverflowに質問があり、そのようなことを行うことの問題を完全に説明しました。

フランケンシュタインのモンスターをさまざまなコードパーツから組み合わせることは、それほど効率的ではありません。つまり、上手くいけば、同じソリューションを何度も複製するか、同じレベルのコピー/貼り付けが不要になるように他の人のコードを十分に理解しているということです。互換性のないコードサンプル間の問題を解決する必要がないため、生産性が向上します。

私は個人的に、大規模にコピー/ペーストする多くのプログラマーに会いませんでした。私は自分自身を最も深くて暗いコーナーにコーディングする人をたくさん見ましたが、それは別の話です。私の個人的な逸話に基づいて、私はほとんどのプログラマーがアプリケーション全体を一緒にコピー/貼り付けしないと言いますが、確かに言うのは本当に難しいです。


1
多くのプログラマーは、実際のコードを大規模にコピー/貼り付けしないかもしれませんが、1行のコードを見ずに既製のライブラリ(無料またはその他)を喜んで活用します
...-hplbsh

1
@Stuart本当ですが、そこにある違いは、そのライブラリがプログラマー自身の作品として主張されないということです。正直なところ、ライブラリが機能し、必要なことを実行している限り、そのソースについても気にする必要はありません。(それ以外の場合は、デューデリジェンスは、ライブラリの信頼性/信頼性が第一に行われると仮定します。)
アダムリア

ある意味では、それはパブリッシャーとコンシューマーの両方の意図の問題です:)
hplbsh

@stuart-私が意味することを知っていれば、それはまとまりのあるユニットであるため、この議論にはライブラリを含めません...本当に「失われた」コードではありません。
ジョンマッキンタイア

実際にあなたのコメントを考えて、私は、プログラマーが完全なシステムを一緒にカット&ペーストすることが可能かどうか正直に考えなければなりません。彼らのhub慢の重みはすぐに雪崩し、彼らの進歩を停止させてしまうと思います。
ジョンマッキンタイア

4

悪い:同じコードブロックを繰り返しコピーして貼り付ける

これを実行していることに気付いた場合は、コピーするコードから何を抽象化できるかを少し考えて、それを処理する関数/メソッドを作成する必要があります。これは、DRY(Do n't Repeat Yourself)原則が考慮される場所です。

良い:動作することがわかっているコードブロックをコピーする

DRY(Do n't Repeat Yourself)もここと同じ意味で適用されます。IE、あなたが過去にすでにやったことを繰り返さないでください。時間をかけてコードのセクションを記述し、デバッグ、テストした場合、本番コードベースで機能することが証明されています。あなたはそれを再利用しないように愚かだろう。

多くの初心者プログラマーはコピーペーストに悪いラップを与えます。多くの初心者プログラマーは、実際に何をするのか理解せずにネットを探し回って他の人のコードのミッシュマッシュをコピー/ペーストするのに時間を費やすからです。

毎回ゼロからすべてを書くことは、これ以上はありません。私は、すべてがゼロから書かれるべきだという古い学校の純粋主義者のプログラマーがたくさんいることを知っています。5年のプログラミング経験がある場合は、再利用に最適なかなり充実したコードライブラリが必要です。開発時間を大幅に節約できるため、経験豊富なプログラマーがテーブルに持ち込むことができる最高の資産の1つです。

最初に古いコードを理解していない場合は、コメントを読んで自分に慣れ親しんでください。あなたのコメントが悪い場合...まあ、それは全く別の問題です。


コードをコピーして貼り付ける代わりに、再利用可能な方法でコードを記述することは完全に可能です。次に、コピーして貼り付ける代わりにそれを使用します。
ビヨン

1
@BjornTiplingはい、そのプロセスが複雑さを増し、コードが再利用されない限り、通常はコードを再利用可能な関数に分解することをお勧めします
Evan Plaice

コピーして貼り付ける場合は、再利用します。私は人々が頭を使うべきであり、条件がそれを保証するかもしれないことに同意します。私はテストを書くときにコピーと貼り付けをしていることに気付きましたが、そこでも再利用可能な関数を作成しようとしますが、ほぼ同じである2つまたは3つの行がありますが、それを十分に一般化することはできません再利用可能な機能。
ビヨン

3

コードを書いて25年たった後、(以前の雇用主のために書いたコードにアクセスできずに)切り取りと貼り付けを望んでいたことがありました。しかし、これは非常にまれです(そして読み続けてください)。

おそらく最良の例は、私が数年前にUnixオペレーティングシステム用に出会った本当にシンプルなコマンドラインパーサーでしょう。引数を圧縮してオプションを処理する単純なループ。それは巧みにシンプルでエレガントであり、それ以来(文字通りのカットアンドペーストよりもパターンとして)何度も使用しています。これはルールではなく例外です。

通常、単純なoleカットアンドペーストは完全に不適切です。重要な概念またはアルゴリズムをよりカットアンドペーストします。

私はあまり誇りに思っていません-本当に高速なパリティまたはハミングコード検証アルゴリズムまたはそのようなエキゾチックなものを見つけるために喜んで検索します。それから、数時間かけてそれを理解し、それが本当に私が求めていた超高速のものなのか、それとも単純なジャンクの山なのかを確かめます。

誰かがコードを理解するために一時停止せずに単にコピーするたびに心配です。彼らは天才(一目でそれとそのすべての微妙さを理解する)、または愚か者です。間に何かをする余地はあまりありません。ああ、そして多くの真の天才もいません。

理解していないと、幸福だけでなく不幸な状況や入力条件の下でも、あなたが本当に投げたものが本当に何なのか分かりません。幸運なことに、これは重要ではありません。そして、時にはこれは非常に長期的な痛みになります。


4
一方、コードを自分で書いてもまだ理解していないプログラマーがいます
...-hplbsh

3

基本的に生産性を上げる必要がある一般的な状況があります。

慣れていない技術は、最初に実際の例を使用しない限り、習得が困難です。したがって、それをコピーして貼り付けて、実際に実行されるものを作成し、それをいじり始めます。


修正:生産性を上げるために基本的に必要だと思う実際の場所があります。したがって、何らかの方法で機能するものをリリースする方法をコピーアンドペーストし、ダメージを修復する方法に苦しんでいることを楽しみます。
ニュートピア

3

新しいプログラマーとして(最初の仕事を始めて4か月)、私は(SOや他の場所から)かなり助けに頼っています。私は他のコードを盲目的にコピーして貼り付けないことを強調します。提供されたコードが私が使用するものであっても、それをプログラムに入力し、それが何をするのか、そしてその理由を完全に理解していることを確認するために少し時間を費やします。

切り貼りの専門家ではなく、常に学習していることを確認したい


1

私はこのトピックについて非常に多くの感情を抱いており、それらのどれもが完全に客観的であると正直に言うことはできません。

他の人のコードをアプリケーションにカットアンドペーストするための多くの議論があります。それらのいくつかは理にかなっているかもしれませんが、そうでないかもしれません。たとえば、誰かのブログから入力を受け取り、数学能力の外にある複雑な数学アルゴリズムを実行し、結果を吐き出すメソッドを取得している場合-これは切り取りと貼り付けの引数です-使用する許可を取得しますコードを作成し、必要に応じてクレジットします-それは名誉あることです。

車輪を再発明しないことには議論があります。これも理論的には理にかなっています。しかし、あなたがあなたがカットアンドペーストしているコードに親しくなるのに時間をかけなければ、この問題を解決するより良い方法があるかどうか、コードにバグがあるかどうかはわかりません。 。貼り付けているホイールが壊れた場合はどうなりますか?

速度と効率性には議論があります-他人のコードのライブラリを構築し、それを盗んだり、盗んだり、盗用したり、あるいは考えてしまうと、Frankensteiningを超えてプログラムする方法を知る必要さえないかもしれません再生部品から一緒に。

私はこの振る舞いを完全に受け入れられると思う時と場所があります。長持ちするように設計されていないが、タスクを完了させるための、クイックスローアウェイツールをフックまたは詐欺によってハッキングするために。理論的な文脈で学び、前進するために、プロトタイピングと集中力の研究のために、これは完全に公正なゲームだと思います。

他の人のコードを切り取って貼り付けるのは盗作です-彼らの祝福があり、貼り付けているコードを理解し、それがアプリケーションのコーディング標準の構造内に収まるなら、それは公正なゲームだと思います。

プロのソフトウェアエンジニアとして、標準と倫理規定を維持するための報酬を受け取っています。私は、他の人の著作権を盗んだり、盗用したり、侵害したりして、クライアントを訴追する危険性があります。これとは別に、カット/ペーストしたコードを実行すると壊滅的な副作用が生じるという非常に現実的なリスクがあります。

ジョンにこの答えを向けるのではなく、このようなトピックに関してはあなたが非常に倫理的に傾いていることを知っているので、これは本当に質問自体の方向への一般的な暴言です。

補遺:とはいえ、プロジェクト間で独自のコードをカットアンドペーストすることは非常に受け入れやすいと感じています。コーディングした人の コードが所有権の機能概念に関係しない限り、ほとんどの雇用主はあなたが他のクライアントのためにあなた自身のアイデアを再利用することで大丈夫であることがわかりました。


あなたが抱えている特定の問題を解決するブログ投稿のコードを使用してどう思いますか?コードの物理的なコピー/貼り付けは、倫理違反とみなされるものですか、それともソリ​​ューションをプロジェクトに再入力することは同じカテゴリに分類されますか?「借用」コードのサイズ(つまり、完全なプログラム/関数と小さなスニペット)はあなたの意見に影響しますか?
アダムリア

2
それがブログ投稿にある場合、著者はそれを公開することを意図しているので、あなたにとって有用であれば、それは公正なゲームだと思います。ただし、一言一言コピーできるコードスニペットはほとんどありません。彼らは通常少し精査が必要です。
ペムダス

チュートリアルやブログ投稿のコードに問題はありません-それが何をするのかを理解してください。おそらくそれが投稿された場​​合、利用可能です。
すぐ

「この答えをあなたに向けないでください」ジョン... ...実際には、あなたがそうだとは思いませんでした...少なくともとにかくこれを読むまでは。笑
ジョンマッキンタイア

盗作に関するコメントとコードの完全な理解が好きですが、自分で書くよりも誰かのコードをコピー/ペーストする方が効率的だと本当に思いますか?あなたはそれを完全に理解しておらず、後で問題を抱えているか、それを完全に理解しようとすると、自分でそれを書くよりも時間がかかることがわかります。KWIM?
ジョンマッキンタイア


0

コードが適切であれば、コピーして貼り付ける代わりに、共通ライブラリに作成する必要があります。しかし、人々はリファクタリングに悩むことはできず、コピーとメソッドによって同じ機能を広めることを好みます。

コピーアンドペーストの普遍的な絶対法則を持っている代わりに、良いか悪いか、それをいつ使用するかを見る必要があります。

コピーと貼り付けの長所は次のとおりです:高速化短所:同じコードが複数の場所に広がっており、コピー/貼り付けの代わりにそれを共通ライブラリとして使用した場合、発見/解決された問題はどこでも解決する必要がありますどこにでも伝播します。さまざまな場所に同じコードを広めるのではなく、ライブラリを使用するという小さな初期投資に対して。

選択肢は、最初に比べて少し時間を節約し、その後コピーアンドペーストを行うか、そうでない場合はリファクタリングして共通ライブラリに配置するかです。


共通ライブラリについては間違いなく同意しますが、そのコードをカットアンドペーストするか、最初から作成する必要がありますか?
ジョンマッキンタイア

コードをインポートする最速の方法はコピーアンドペーストですが、プロジェクトに組み込む前にコードを確認し、必要に応じて変更する必要があります。
アルジャン

0

ほとんどの場合、ネット上で見つかるコードは正確な目的に適合しません。

自分が多くのことをしているのは、誰かからコードをコピーし、それを非常に本質的に取り除いてから、要件を満たすまでコードを追加することです。命名規則とコーディングスタイルに合わせて、常にリファクタリングします。

チュートリアルを読んだとき、私は個人的にそれを嫌い、彼らは複雑なケースのコードを表示することから始めます。本質から始めて、コードを拡張するための構成要素を示します。私が自分のブログを始めたら、私がやりたいことの本質、機能/特別なケースを追加する方法、および基本機能の完全に機能する例を示すコメント付きコード例を提供します。


-1

コードが何をしているのかを理解し、コードを再利用(またはそのオープン)する許可を持っていて、他の人が書いたコードのすべてを必ずしも必要としないなら、なぜ車輪を再発明するのか。アルゴリズムの実装を頻繁にコピーし、自分のニーズに合わせて修正します。通常、カットアンドペーストするのは、例にあるすべてのものが必要なわけではないため、別のファイルを追加するだけで無駄になります(または関数内の何かです)。同じプロジェクト内で独自のコードをカットアンドペーストしている場合、jzdに同意します。間違った方法があり、おそらくそれをlibにするか、関数を共有する経済的な方法を見つける必要があります。


-1

統合」チームのメンバーや、コードやプログラミングの経験があまりない人は、コピーアンドペーストを頻繁に行い、彼らが何をしたのか理解できません(質問に記載されている問題に遭遇します)。

また、プログラマーは、コードを愛し、車輪を再発明することが多いため、カットアンドペーストから自分の悔しさを避けていることがよくあります。


改革のために+1。また、コピー貼り付けの代わりに、インターネットからコードを書き換えるのに時間がかかります。私は締め切りに制限されていないので、私はそれを行うと思います。私は自分で自由に学ぶことができます。また、自分が望むときに何を学ぶことができます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.