Dlaczego" Kopiuj i wklej " kodu jest niebezpieczne? [zamknięte]

Czasami mój szef będzie nam narzekał:

Po co nam tyle czasu na implementację funkcji?

Faktycznie, funkcja została zaimplementowana w innej aplikacji wcześniej, wystarczy skopiować i wkleić kody stamtąd. Koszt powinien być niski.

To naprawdę trudne pytanie, ponieważ kopiowanie i wklejanie kodów nie jest tak prostą rzeczą z mojego punktu widzenia.

Czy masz jakieś dobre powody, aby wyjaśnić to swoim nietechnicznym szefie?

Author: GraemeMiller, 2010-03-22

18 answers

Jeśli znajdziesz błąd w kodzie kopiuj-wklej, musisz go naprawić w każdym miejscu i mieć nadzieję, że zapamiętasz je wszystkie (dotyczy to również zmienionych wymagań).

Jeśli trzymasz logikę w jednym miejscu, łatwiej jest ją zmienić w razie potrzeby (więc jeśli zdecydujesz, że aplikacja wymaga aktualizacji, robisz to tylko w jednym miejscu).

Niech twój szef poczytuje o suchej zasadzie (nie powtarzaj się).

To co opisujesz brzmi jak idealne zastosowanie dla biblioteki , w których udostępniasz kod i przechowujesz go tylko w jednym miejscu.

Skopiowałbym i wkleił Kod tylko wtedy, gdy zamierzałem refactor wkrótce potem - upewniając się, że później wyodrębniłem wspólny kod, aby móc ponownie wykorzystać jak najwięcej logiki. A mówiąc krótko po, mam na myśli minuty i godziny później, a nie dni i tygodnie.

 166
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 20:49:55

Byłoby znacznie lepiej dzielenie się kodem budując bibliotekę, a nie Kopiowanie kodu za pomocą Kopiuj i wklej.

Nadal zyskasz przewagę szybkości nad ponownym pisaniem (look up DRY), ale będziesz miał tylko jedno miejsce na utrzymanie kodu.

 25
Author: CResults,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 06:43:16

Oczywistym powodem jest to, że bierzesz na siebie "dług" na przyszłość: każda zmiana, którą kiedykolwiek będziesz musiał wprowadzić w kodzie (nie tylko poprawki błędów, każda zmiana), będzie teraz dwa razy droższa, ponieważ musisz zaktualizować dwa miejsca - i bardziej ryzykowna, ponieważ w końcu zapomnisz o jednym z nich. Innymi słowy, dzięki temu, że teraz będzie działać szybciej, Twoja praca będzie jeszcze wolniejsza w przyszłości, co może być dobrym zmysłem biznesowym, ale zazwyczaj tak nie jest.

Ale ważniejszym powodem jest to, że założenie "to jest to samo" jest częściej niż subtelnie błędne. Ilekroć Twój kod zależy od niewypowiedzianych założeń, aby był poprawny, skopiowanie go w inne miejsce powoduje błędy, chyba że te założenia również utrzymują się w nowym miejscu. Dlatego wklejony kod jest często błędny od początku, a nie tylko po następnej zmianie.

 12
Author: Kilian Foth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 09:05:01

Pod względem projektowym, skopiowany kod jest z pewnością katastrofą, która może spowodować wiele problemów w przyszłości. Ale pytasz, dlaczego zajmuje ci to dużo pracy teraz, odpowiedź brzmi: ponieważ nigdy nie jest to tylko kopiowanie i wklejanie.

Jeśli oryginalny kod został napisany w celu ponownego użycia, jako dość niezależna biblioteka, z elastycznością i korzystaniem z Klienta - to świetnie, ale to nie jest kopiowanie-wklejanie, to Korzystanie z biblioteki kodu. Real code copy-wklejanie Zwykle idzie bardziej TAK:

  • "jasne, Mam już kod, który robi dokładnie to!"
  • "czekaj, która z tych pięciu wersji kodu jest tą, której chcę użyć jako źródła?"
  • "Hmmm, do czego służą te wszystkie funkcje 'util_func_023'? Nie udokumentowałem ich? Którego z nich potrzebuję?"
  • " O, tak, ten kod używa kodu Base Y. chyba muszę [wybrać jeden: skopiować cały kod base Y do mojego nowego projektu / spędzić dzień na wyodrębnianiu jedynej funkcji, z której chcę Code Base Y / spend a week exstricating the one function I want from Code Base Y]."
  • "skopiowałem wszystko, yay!"
  • "Dlaczego to nie działa?"
  • jest to punkt, w którym spędzasz godziny/dni / tygodnie debugując istniejący kod, który jest podobny do tego, co chcesz, zamiast pisać kod, od którego chcesz zacząć.

Podsumowując, istniejący kod, który nie może być użyty bezpośrednio, może w najlepszym razie służyć jako dobry punkt odniesienia do pisania podobnego kodu. Na pewno nie może być podnoszony w całości i oczekuje się pracy w zupełnie innym systemie. Ogólnie rzecz biorąc, jest to bezpieczne założenie, że każdy kod, który został napisany i ukończony, powinien być jak najmniej namieszany - nawet jeśli jest to kopia, a nie sam oryginał.

Jeśli chcesz oprzeć swój projekt na kopiowaniu-wklejaniu, musisz kodować , Aby rozpocząć od w sposób, który umożliwi łatwe ponowne użycie, Bez kopiowania oryginalnego kodu i mieszania się z nim. Warto to zrobić i jeśli tego oczekuje twój szef, oboje musicie się upewnić, że w ten sposób projektujecie i pracujecie.

 10
Author: Ziv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 11:30:01

Kopiowanie i wklejanie to katastrofa, która czeka. Twój szef powinien ocenić cenę wysyłki wcześniej w odniesieniu do ceny uszkodzonego kodu wysłanego do użytkownika końcowego bardzo szybko.

 9
Author: Stefano Borini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 08:58:57

Jeśli masz już zaimplementowane funkcje i potrzebujesz skopiować i wkleić, aby je ponownie wykorzystać, brzmi to, jakbyś zrobił coś złego. Nie możesz umieścić tych funkcji w bibliotece, aby można było ich ponownie używać bez kopiowania/wklejania?

 9
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 09:02:40

Sucha zasada (nie powtarzaj się): suche na Wikipedii.

" każdy kawałek wiedzy musi mieć jedną, jednoznaczną, autorytatywną reprezentację w systemie."

Inny link .

 8
Author: Gauthier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 09:05:08

Wydaje mi się, że najgorsze nieporozumienie, jakie ma twój nietechniczny szef, polega na tym, że Twoja praca polega głównie na pisaniu. Uważają, że można zaoszczędzić dużo czasu, eliminując pisanie.

Myślę, że najlepszą edukacją, jaką możesz dać tej osobie, jest zwrócenie uwagi na całą twoją pracę, która nie jest pisaniem. Nawet jeśli większość tej pracy zwykle dzieje się niewidocznie, w twojej głowie, w tym samym czasie, co pisanie.

Jasne, wyeliminowanie typowania zaoszczędzi trochę czasu. Ale wtedy znacznie większe, brak pisania, część pracy staje się większa i pochłania każdą oszczędność czasu i więcej poza tym.

 6
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-22 11:28:23

Jesteś pewien, że twój szef chce usłyszeć o suchych zasadach, robakach i innych technicznych rzeczach?

Tego typu komentarze Zwykle słychać, gdy szef lub firma nie doceniają czasu potrzebnego na ukończenie jakiegoś projektu. I na podstawie błędnej wyceny podpisano umowę itp. W większości przypadków programiści nie byli zaangażowani w szacunki.

Dlaczego tak się dzieje? Czasami sponsor projektu ma zbyt mały budżet. Może proces biznesowy, który automatyzujesz za pomocą oprogramowania, nie jest wart twojego zespołu wysiłek. Menedżerowie zazwyczaj są bardzo zamknięci z powodu złych wiadomości w takich przypadkach. Na początku projektu jest myślenie życzeniowe. Następnie menedżerowie próbują obwiniać programistów. W Twoim przypadku pośrednio poprzez Kopiuj i wklej. W skrajnych przypadkach nazywa się to marszem śmierci .

 4
Author: Greg Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 21:22:43

Kopiowanie i wklejanie kodu zwykle prowadzi do programowania przez przypadek

 3
Author: Lucas Ayala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 09:08:28

Myślę, że" another application " jest tutaj kluczem, jeśli druga aplikacja jest już przetestowana i używana, nie powinno być zmieniane , aby używać wspólnej biblioteki, dlatego nie możesz dzielić się z nią kodem.

W tej samej aplikacji, "Kopiuj i wklej" jest złe, ale pomiędzy bazami kodu, które są opracowywane przez różne zespoły lub z różnymi cyklami wydania, "Kopiuj i wklej" może być najlepszą opcją.

 3
Author: Ian Ringrose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-18 14:39:20

Pracowałem w podobnej firmie. Będąc stażystą, nie wiedziałem wtedy lepiej, więc kiedy zaczynałem nowy projekt, mój szef zasugerował również wklejenie kodu z innego miejsca. Cóż, jak może się wydawać, całe oprogramowanie było niezłym bałaganem, aż do tego stopnia, że gdy próbowałeś naprawić błąd, pojawiły się dwa nowe błędy.

 2
Author: helpermethod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 09:08:48

Nawet jeśli inna aplikacja ma już funkcję, której potrzebujesz, Kod tej funkcji może po prostu nie pasować do bieżącej aplikacji bez poważnej przeróbki. To jak zabranie silnika Forda i próba dopasowania go do Toyoty. Ogólnie rzecz biorąc, istnieje zasada, że jeśli musisz zmodyfikować więcej niż 25% skopiowanego kodu, lepiej (taniej) napisać go od zera.

Wyodrębnienie omawianego kodu do biblioteki brzmi przekonująco, ale może być bardziej trudne, niż się wydaje, w zależności od tego, jak zbudowany jest inny system. Np. kod dla tej funkcji może być trudny do wyodrębnienia, ponieważ łączy wiele innych kodów w nieczysty sposób (np. poprzez dostęp do wielu zmiennych globalnych itp.)

 2
Author: Erich Kitzmueller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 11:41:45

Powiedz swojemu szefowi, że część nazwy każdej zmiennej zawiera nazwę starego projektu i teraz musisz zmienić je wszystkie, ręcznie. Jeśli twój szef nie wie (lub chce wiedzieć) dlaczego kopiowanie / wklejanie jest złe, równie dobrze może w to uwierzyć:)

 1
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 09:08:22

Istnieją kompromisy między szybkością rozwoju natychmiastowej funkcjonalności przed tobą( zwłaszcza gdy aplikacja jest mała), a długofalowymi kosztami utrzymania w miarę wzrostu aplikacji.

Kopiowanie i wklejanie jest szybsze dla natychmiastowej funkcjonalności, ale będzie drogo kosztować, jak aplikacja rośnie rozmiar, w zakresie naprawiania błędów i dokonywania zmian w całym systemie i utrzymania przepływu pracy między różnymi komponentami aplikacji.

To jest argument, który właściciele firm muszą usłyszeć. Jest to podobne do przyjętych kosztów utrzymania floty pojazdów, jednak w przypadku oprogramowania zepsute aspekty architektury oprogramowania są zazwyczaj ukryte dla strony biznesowej i mogą być widoczne tylko przez programistów.

 1
Author: user2686692,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 16:46:18

Ma rację, że jeśli zespół wcześniej zaimplementował podobną funkcjonalność, powtórzenie jej będzie dużo łatwiejsze za drugim razem.

Należy jednak wyjaśnić, że każda aplikacja jest inna. To, że zainstalowałeś drzwi w jednym domu, nie oznacza, że możesz zainstalować inne drzwi w innym domu w no time flat - będziesz szybszy ze względu na doświadczenie (# Doors installed), ale nadal potrzeba czasu, aby zdobyć sprzęt, zamontować drzwi, upewnij się, że jest pion, i przykręcić go do ramy.

 0
Author: bobobobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-15 14:37:34

Tak, największym problemem jest to, że nie jest to tylko kopiowanie i wklejanie - jego kopiowanie następnie wklejanie, a następnie nieznacznie modyfikować.

Później, gdy jeden z wklejonych wariantów ma problem, zostaje zmieniony. Później zmienia się inny wariant.

Następnie dowiadujemy się, że wszystkie warianty muszą się zmienić, ponieważ oryginalna kopia miała błędy. Teraz jesteś dobrze i naprawdę wkręcony, ponieważ wszystkie wklejone obszary nie są teraz takie same.

I nie wiesz tego, tego rodzaju gówniane kodowanie jest zwykle prawie całkowicie pozbawione komentarzy.

Dla mnie różnica polega na tym, że gdy masz kilka kopii kodu robiących to samo, to co masz to kupa kodu. Gdy masz tylko jeden kawałek kodu robiący każdą konkretną rzecz, to masz system.

Zachowania systemu można dość łatwo zmieniać za pomocą pojedynczych modyfikacji punktowych - zmiana zachowania zestawu kodu wymaga zestawu kodu.

Lubię systemy, a nie kupę kodu.

 0
Author: Rodney P. Barbati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-11 00:39:38

W mojej firmie zawsze pracujemy z klasami i metodami, wykonujemy dla nich dokumentację techniczną. Myślę, że to najlepsza praktyka, jeśli możesz użyć własnych aplikacji wyszukiwania svn z dobrymi kluczami, aby znaleźć klasę metody używaną wcześniej:)

 0
Author: Sebastian 506563,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 06:45:54