Ponowne użycie kodu jest całkiem dobrym pomysłem. Niezbyt dobry .
Mam perspektywę zaczerpniętą z około 30 lat inżynierii oprogramowania, która próbuje „ponownie wykorzystać”.
Zacząłem badać „ponowne użycie kodu” jako temat badawczy już w latach 80., po odkryciu, że ponownie wykorzystałem projekt jednego systemu operacyjnego, który zbudowałem na początku lat 70., dla innego systemu operacyjnego, który zbudowałem pod koniec lat 70.
Dobrą częścią ponownego wykorzystania kodu jest zdolność do ponownego wykorzystania istniejącego wcześniej, uczciwego boga kodu. Ale świat jest pełen kodu; jak znaleźć to, czego chcesz? Oto, co nazywam klątwą ponownego użycia :
Jestem Święty Mikołaj (ok Open Source) i mam worek 1 miliarda komponentów oprogramowania. Możesz mieć jeden z nich.
Powodzenia w wyborze.
Aby dobrze rozwiązać problem ponownego użycia:
- użytkownik musi w jakiś sposób określić, czego potrzebuje (funkcjonalność, wydajność, język docelowy, założenia środowiskowe, ...)
- musi istnieć biblioteka kodu „wielokrotnego użytku”, który został zaindeksowany na różne sposoby według tych potencjalnych kryteriów
- musi istnieć jakiś mechanizm wybierania elementów kandydujących (przy miliardie elementów nie można na nie patrzeć osobiście)
- musi istnieć sposób na scharakteryzowanie, jak daleko od specyfikacji są wybrani kandydaci
- powinien istnieć jakiś regularny proces, aby umożliwić użytkownikowi modyfikację wybranego kodu wielokrotnego użytku (oto największy wkład OOP: możesz edytować istniejący komponent / obiekt, zastępując jego szczeliny. OOP nie zapewnia żadnej innej pomocy).
- wszystko to musi być zdecydowanie tańsze niż zwykłe przekodowanie
Przez lata odkryto przede wszystkim, że aby kod mógł być ponownie użyty, musi być zaprojektowany w tym celu lub zawiera zbyt wiele domniemanych założeń. Biblioteki, które odniosły największe sukcesy, były w rzeczywistości dość małe. Prawdopodobnie biblioteki i frameworki są kodem „wielokrotnego użytku” i odnoszą ogromne sukcesy; Java i C # odnoszą sukcesy nie dlatego, że są całkiem niezłymi językami komputerowymi, ale raczej dlatego, że mają do dyspozycji ogromne, dobrze zaprojektowane, zaimplementowane i udokumentowane biblioteki. Ale ludzie nie patrzą na kod źródłowy w bibliotekach; po prostu wywołują dobrze udokumentowany interfejs API (zaprojektowany tak, aby był ogólnie użyteczny).
To, czego ponowne użycie kodu nie dokonało (OOP też), zapewnia poprawę wielkości naszych systemów kodowania.
Myślę, że kluczową wadą jest to, że jakiekolwiek ponowne użycie kodu jest zasadniczo ograniczone, ponieważ kod ma zbyt wiele założeń . Jeśli sprawisz, że kod będzie mały, zminimalizujesz założenia, ale wtedy koszt budowy od zera nie będzie bardzo duży, a zyski z ponownego użycia nie będą skuteczne. Jeśli sprawisz, że fragmenty kodu będą ogromne, będą one prawie bezużyteczne w nowym kontekście. Podobnie jak Guliwer, są przywiązani do plaży milionem małych sznurków i po prostu nie możesz sobie pozwolić na przecięcie ich wszystkich.
Powinniśmy pracować nad ponownym wykorzystaniem wiedzy do konstruowania kodu . Jeśli możemy to zrobić, możemy zastosować tę wiedzę do skonstruowania potrzebnego nam kodu, obsługując bieżący zestaw założeń.
Aby to zrobić, nadal potrzebna jest ta sama zdolność specyfikacji do charakteryzowania komponentów oprogramowania (wciąż musisz powiedzieć, co chcesz!). Ale następnie zastosujesz tę wiedzę „konstrukcyjną” do specyfikacji, aby wygenerować pożądany kod.
Jako społeczność nie jesteśmy jeszcze w tym zbyt dobrzy. Ale ludzie robią to cały czas; dlaczego nie możemy tego zautomatyzować? Istnieje wiele badań, co pokazuje, że można to zrobić w wielu okolicznościach.
Jednym z kluczowych urządzeń potrzebnych do tego są mechaniczne narzędzia do akceptowania „opisów komponentów” (są to tylko formalne dokumenty i można je analizować jak języki programowania) i stosować do nich transformacje programów .
Kompilatory już to robią: -} I są naprawdę dobre w klasie problemów, które rozwiązują.
Modele UML z generowaniem kodu to jedna próba tego. Niezbyt dobra próba; właściwie w większości modeli UML mówi się: „Mam dane, które wyglądają tak”. Trudno jest wygenerować prawdziwy program, jeśli pominięto funkcjonalność.
Próbuję zbudować praktyczne systemy transformacji programów, narzędzie o nazwie DMS . Byłem dość dobrze rozproszony, stosując transformacje programu nie tyle do abstrakcyjnych specyfikacji, aby wygenerować kod, ale raczej do starszego kodu, aby go wyczyścić. (Są to ten sam problem w streszczeniu!). (Budowa takich narzędzi zajmuje dużo czasu; robię to od 15 lat, a tymczasem musisz jeść).
Ale DMS ma dwie kluczowe właściwości, które opisałem powyżej: możliwość przetwarzania dowolnych specyfikacji formalnych oraz zdolność do przechwytywania „wiedzy na temat generowania kodu” jako transformacji i stosowania ich na żądanie. I, co niezwykłe, generujemy w niektórych szczególnych przypadkach jakiś dość interesujący kod ze specyfikacji; DMS jest w dużej mierze zbudowany przy użyciu samego siebie do generowania swojej implementacji. To osiągnęło dla nas przynajmniej część obietnicy ponownego wykorzystania (wiedzy): wyjątkowo znacznego wzrostu wydajności. Mam zespół około 7 osób technicznych; napisaliśmy prawdopodobnie 1-2 MSLOC „specyfikacji” dla DMS, ale mamy około 10MSLOC wygenerowanego kodu.
Podsumowanie: ponowne wykorzystanie wiedzy generacyjnej to zwycięstwo, a nie ponowne użycie kodu .