스파게티 코드

Spaghetti code

스파게티 코드는 구조화되지 않고 유지보수가 어려운 소스 코드를 경멸하는 표현입니다.스파게티 코드는 가변적인 프로젝트 요구 사항, 프로그래밍 스타일 규칙 부족, 능력이나 [1]경험이 부족한 소프트웨어 엔지니어 등 여러 요인에 의해 발생할 수 있습니다.

의미.

구조화된 프로그래밍 구조가 아닌 GOTO 문을 과도하게 사용하여 복잡하고 유지보수가 불가능한 프로그램을 생성하는 코드를 스파게티 [2]코드라고 합니다.이러한 코드는 복잡하고 얽힌 제어 구조를 가지고 있어 개념적으로 스파게티 그릇과 같은 프로그램 흐름이 꼬이고 [3]얽혀 있습니다.1980년 미국 국립표준국에 의한 간행물에서는 스파게티 프로그램이라는 문구가 "파편화되고 흩어진 파일"[4]을 가진 오래된 프로그램을 묘사하기 위해 사용되었다.스파게티 코드는 오브젝트 지향 코드가 지나치게 길고 지저분한 클래스를 만들거나 다형성 [5]등의 오브젝트 지향 개념을 버림으로써 절차적인 스타일로 작성되는 안티 패턴을 설명할 수도 있습니다.이러한 형식의 스파게티 코드가 있으면 시스템의 [6]이해도가 크게 저하될 수 있습니다.

역사

스파게티 코드라는 문구가 언제 보편적으로 사용되었는지는 분명하지 않지만, [7]가이 스틸마카로니가 스파게티보다 낫다를 포함한 몇 가지 언급이 1977년에 나왔다.1978년 출판된 'PL/I, PL/CS PL/CT를 사용한 규율된 프로그래밍에 관한 입문'에서 리처드 콘웨이는 이 용어를 "스파게티 [8]한 접시와 동일한 깨끗한 논리 구조를 가진" 프로그램의 유형을 설명하기 위해 사용했다. 이는 1979년 데이비드 [9]그리스와 공동 집필한 '프로그래밍 입문'에서 반복되었다.1988년 논문 '소프트웨어 개발강화의 나선형 모델'에서 이 용어는 계획이 부족하고 결국 폭포수 [10]모델의 개발로 이어진 코드 및 고정 모델의 오래된 관행을 설명하기 위해 사용됩니다.1979년 COBOL 프로그래머를 위한 구조화된 프로그래밍이라는 책에서 작가 폴 놀은 스파게티 코드와 둥지라는 문구를 동의어로 사용하여 제대로 구조화되지 않은 소스 [11]코드를 묘사합니다.

Ada – Europe 93 컨퍼런스에서 Ada는 예외 전파 [12]메커니즘이 제한적이기 때문에 프로그래머에게 "스파게티 코드 대신 이해할 수 있는 코드"를 생성하도록 강요했다고 설명되었습니다.

1981년 미시간 테크니컬지의 컴퓨터 언어 스푸핑에서 "기본적으로 말하면...FORTRAN 바이트!!"는 FORTRAN에 대해 "전적으로 스파게티 코드로 [13]구성되어 있다"고 기술했습니다.

리처드 해밍은 강연에서[14] 이 용어의 어원을 바이너리 코드로 초기 프로그래밍하는 맥락에서 설명했습니다.

오류를 수정할 때 생략된 명령을 삽입해야 할 경우 직전 명령을 수행하고 빈 공간으로 옮깁니다.여기에 방금 작성한 지시사항을 입력하고 삽입할 지시사항을 추가한 다음 메인 프로그램으로 다시 전송합니다.따라서 이 프로그램은 곧 이상한 곳으로의 제어의 연속이 되었다.대부분의 경우처럼 수정 시 오류가 발생한 경우 다른 사용 가능한 공간을 사용하여 동일한 방법을 다시 사용했습니다.결과 스토리지를 통한 프로그램 제어 경로는 곧 스파게티 캔의 형태를 띠게 되었습니다.명령어 실행 중에 삽입만 하면 되지 않을까요?그러면 전체 프로그램을 검토하고 이동된 지침을 참조하는 모든 주소를 변경해야 하기 때문입니다.그것만 빼고 아무거나!

관련 문구

라비올리 코드

Ravioli 코드는 객체 지향 프로그래밍에 고유한 용어입니다.고립된 상태에서는 이해하기 쉽지만 [15]전체적으로 이해하기 어려운 잘 구성된 클래스를 포함하는 코드를 설명합니다.

라자냐 코드

라자냐 코드는 레이어가 너무 복잡하고 얽혀 있어 한 레이어를 변경하면 다른 모든 [16]레이어를 변경해야 하는 코드를 말합니다.

다음은 BASIC에서 스파게티 코드의 간단한 예로 간주되는 것을 나타냅니다.1 ~ 100 의 각 숫자가 정사각형과 함께 화면에 인쇄됩니다.코드와 프로그램의 동작에 의해 수행되는 다양한 액션을 구별하기 위해 식별을 사용하지 않습니다.GOTO스테이트먼트는 회선번호에 의존합니다.한 영역에서 다른 지역으로의 실행 흐름은 예측하기 어렵습니다.실제 스파게티 코드는 더 복잡하며 프로그램의 유지 보수 비용이 크게 증가할 수 있습니다.

1 i=0; 2 i=i+1; 3 인쇄하다 i; "param=";i*i; 4 한다면 i< >100 그리고나서 에 가다 2; 5 인쇄하다 "프로그램 완료"; 6 끝. 

다음은 구조화된 프로그래밍 스타일로 작성된 동일한 코드입니다.

1 위해서 i=1 로. 100 2     인쇄하다 i;"param=";i*i 3 다음 분. i 4 인쇄하다 "프로그램 완료" 5 끝. 

프로그램은 한 영역에서 다른 영역으로 점프하지만, 루프와 함수의 경우 흐름 제어를 제공하는 반면 goto 문장은 임의 흐름 제어를 장려하기 때문에 이 점프는 공식적이고 더 쉽게 예측할 수 있다.이 예는 작지만 실제 프로그램은 여러 줄의 코드로 구성되며 스파게티 코드 방식으로 작성되면 유지보수가 어렵습니다.

다음은 GOTO 문이 포함된 스파게티 코드의 다른 예입니다.

  입력 "몇 개의 숫자를 정렬해야 합니까?"; T   DIM n(T)   위해서 i = 1 로. T     인쇄하다 "번호:"; i     입력 n(i)   다음 분. i   '계산:   C = T  E180:   C = 인트(C / 2)   한다면 C = 0 그리고나서 에 가다 C330   D = T - C   E = 1  I220:   f = E  F230:   g = f + C   한다면 n(f) > n(g) 그리고나서 바꾸다 n(f), n(g)   f = f - C   한다면 f > 0 그리고나서 에 가다 F230   E = E + 1   한다면 E > D 그리고나서 에 가다 E180  에 가다 I220  C330:   인쇄하다 "정렬된 리스트는"   위해서 i = 1 로. T     인쇄하다 n(i)   다음 분. i 

「 」를 참조해 주세요.

레퍼런스

  1. ^ Markus, Pizka (2004). "Straightening spaghetti-code with refactoring?" (PDF). Software Engineering Research and Practice: 846–852. Archived from the original (PDF) on 5 March 2018. Retrieved 5 March 2018.
  2. ^ Cram, David; Hedley, Paul (2005). "Pronouns and procedural meaning: The relevance of spaghetti code and paranoid delusion" (PDF). Oxford University Working Papers in Linguistics, Philology and Phonetics. 10: 187–210. Retrieved 5 March 2018.
  3. ^ Horstmann, Cay (2008). "Chapter 6 - Iteration". Java Concepts for AP Computer Science (5th ed. [i.e. 2nd ed.]. ed.). Hoboken, NJ: J. Wiley & Sons. pp. 235–236. ISBN 978-0-470-18160-7. Retrieved 2 January 2017.
  4. ^ United States National Bureau of Standards (1980). ASTM special technical publication. United States Government Printing Office.
  5. ^ Moha, N.; Gueheneuc, Y. G.; Duchien, L.; Meur, A. F. Le (January 2010). "DECOR: A Method for the Specification and Detection of Code and Design Smells". IEEE Transactions on Software Engineering. 36 (1): 20–36. CiteSeerX 10.1.1.156.1524. doi:10.1109/TSE.2009.50. ISSN 0098-5589. S2CID 14767901.
  6. ^ Abbes, M.; Khomh, F.; Gueheneuc, Y. G.; Antoniol, G. (2011). An Empirical Study of the Impact of Two Antipatterns, Blob and Spaghetti Code, on Program Comprehension. 2011 15th European Conference on Software Maintenance and Reengineering. pp. 181–190. CiteSeerX 10.1.1.294.1685. doi:10.1109/CSMR.2011.24. ISBN 978-1-61284-259-2. S2CID 14152638.
  7. ^ 가이 루이스 스틸, 1977년스파게티보다 마카로니가 더 맛있어요.1977년 인공지능과 프로그래밍 언어에 관한 심포지엄의 계속에서.컴퓨터 기계 협회, 뉴욕, 뉴욕, 미국, 60~66.DOI: https://doi.org/10.1145/800228.806933
  8. ^ Conway, Richard (1978). A primer on disciplined programming using PL/I, PL/CS, and PL/CT. Winthrop Publishers. ISBN 978-0-87626-712-7.
  9. ^ Conway, Richard; Gries, David (1979). An Introduction to Programming (3rd ed.). Little, Brown. ISBN 978-0-316-15414-7.
  10. ^ Boehm, Barry W. (May 1988). "A spiral model of software development and enhancement". IEEE Computer. 21 (2): 61–72. doi:10.1109/2.59. S2CID 1781829.
  11. ^ Noll, Paul (1977). Structured programming for the COBOL programmer: design, documentation, coding, testing. M. Murach & Associates.
  12. ^ Schwille, Jürgen (1993). "Use and abuse of exceptions — 12 guidelines for proper exception handling". Lecture Notes in Computer Science. Ada – Europe '93 (Proceedings). Lecture Notes in Computer Science. Vol. 688. Springer Berlin Heidelberg. pp. 142–152. doi:10.1007/3-540-56802-6_12. ISBN 978-3-540-56802-5.
  13. ^ MTSBS[clarification needed] (March–April 1981). "BASICally speaking...FORTRAN bytes!!". The Michigan Technic. 99 (4).{{cite journal}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  14. ^ Hamming, Richard (1996). The Art of Doing Science and Engineering. ISBN 9056995006.
  15. ^ Troyer, O. De (13 May 1991). "The OO-binary relationship model : A truly object oriented conceptual model". Advanced Information Systems Engineering. Notes on Numerical Fluid Mechanics and Multidisciplinary Design. Vol. 141. pp. 561–578. doi:10.1007/3-540-54059-8_104. ISBN 978-3-319-98176-5. {{cite book}}:누락 또는 비어 있음 title=(도움말)
  16. ^ Tomov, Latchezar; Ivanova, Valentina (October 2014). "Teaching Good Practices In Software Engineering by Counterexamples". Computer Science and Education in Computer Science (1): 397–405. Retrieved 5 March 2018.

외부 링크