ภาษาไดนามิกมีผลเสียต่อการพัฒนาที่คล่องตัวหรือไม่?


12

จากสิ่งที่ฉันได้อ่านการพัฒนาที่คล่องตัวมักจะเกี่ยวข้องกับการเปลี่ยนโครงสร้างหรือเปลี่ยนรหัสวิศวกรรมเป็นไดอะแกรม แน่นอนมีมากกว่านั้น แต่ถ้าเราพิจารณาการปฏิบัติที่อาศัยสองวิธีนี้เป็นภาษาที่พิมพ์แบบไดนามิกที่เสียเปรียบ?

ดูเหมือนว่าภาษาที่พิมพ์แบบคงที่จะทำให้การปรับโครงสร้างและวิศวกรรมย้อนกลับง่ายขึ้นมาก

การรีแฟคเตอร์หรือวิศวกรรมย้อนกลับเป็นเรื่องยากหากไม่สามารถทำได้ในภาษาที่พิมพ์แบบไดนามิกหรือไม่? โครงการโลกแห่งความจริงบอกอะไรเกี่ยวกับการใช้ภาษาที่พิมพ์แบบไดนามิกสำหรับวิธีการแบบเปรียว


5
โอนรหัสวิศวกรรมลงในไดอะแกรมหรือไม่ ทำไมคุณต้องทำอย่างนั้นในเปรียว
— CaffGeek

7
Agile ไม่ได้แปลว่า "code first, document later"
— Gort the Robot

@CaffGeek: หนังสือที่แนะนำมักจะแนะนำให้วาดไดอะแกรมบนไวท์บอร์ดจากนั้นให้โค้ดและในที่สุดก็ย้อนรหัสวิศวกรลงในไดอะแกรมสำหรับการประชุมครั้งต่อไป
— Gerenuk

1
ฉันคิดว่าควรพิมพ์ตัวอักษรที่รุนแรงออกจากแท็กและข้อความของคำถามนี้ คำถามดูเหมือนว่าจะเกี่ยวกับคงที่และแบบไดนามิกไม่แข็งแรงเทียบกับที่อ่อนแอ
— Winston Ewert

@WinstonEwert - โทรดีฉันเปลี่ยนแท็กเป็นdynamic-typingและstatic-typing
— Carson63000

คำตอบ:


11

ภาษาไดนามิกนั้นมีข้อเสียเปรียบในทางทฤษฎีสิ่งอื่นเท่ากันเพราะพวกเขาระบุน้อยกว่าเกี่ยวกับวิธีการทำงานของรหัส (ข้อ จำกัด คืออะไร) ดังนั้นการปรับโครงสร้างให้น้อยลงสามารถทำได้โดยอัตโนมัติและปัญหาที่เกิดขึ้นไม่สามารถตรวจพบได้โดยอัตโนมัติเช่นกัน .

แต่ทุกอย่างอื่นไม่เท่ากัน ภาษาไดนามิกที่เป็นที่นิยมที่สุดอนุญาตให้ใช้โค้ดที่มีขนาดกะทัดรัด แต่เข้าใจได้สูงซึ่งโดยทั่วไปจะทำให้การพัฒนาเร็วขึ้นและทำให้ตรรกะ (ซึ่งอาจเปลี่ยนการรีแฟคเตอร์) ได้ง่ายขึ้น ดังนั้นแม้ว่าคุณจะสูญเสียความได้เปรียบเชิงสัมพันธ์บางส่วนของการทำงานในภาษาไดนามิก แต่คุณอาจยังคงออกมาข้างหน้าโดยเฉพาะอย่างยิ่งหากคุณวางแผนที่จะทำการปรับโครงสร้างด้วยมือต่อไป

ในทางตรงกันข้ามมีภาษาที่พิมพ์แบบคงที่โดยมีข้อได้เปรียบเช่นเดียวกับภาษาไดนามิก (เช่นขนาดกะทัดรัดและเข้าใจได้ - มีประเภทส่วนใหญ่อนุมาน แต่มีมาก): Haskell อาจเป็นตัวอย่างชั้นนำ แต่ OCaML / F #, Scala, และอื่น ๆ ที่อยู่ในหมวดหมู่นี้ด้วย น่าเสียดายเนื่องจากมีการใช้งานน้อยกว่าภาษาที่พิมพ์แบบคงที่ที่ได้รับความนิยมมากที่สุดจึงไม่มีชุดเครื่องมือมากมายสำหรับพวกเขา (เช่นสำหรับการปรับโครงสร้างใหม่)

ดังนั้นในฐานะที่เป็นกำไรฉันคิดว่าคุณจะมีวิธีการที่คล่องตัวในภาษาส่วนใหญ่อย่างเพียงพอ ฉันจะไม่พูดว่ามีผู้ชนะที่ชัดเจนในขณะนี้เนื่องจากการฝึกฝนยังไม่ทันกับทฤษฎี


ฉันคิดว่าคำตอบนี้ตอบประเด็นสำคัญของคำถามได้ดีที่สุด :) คุณช่วยอธิบายเกี่ยวกับความสำคัญของการปรับโครงสร้างที่ปลอดภัยและวิศวกรรมย้อนกลับเพื่อการพัฒนาที่คล่องตัวได้หรือไม่? ฉันสมมติว่ามันมีบทบาทสำคัญมาก? อาจจะน้อยกว่าที่ฉันคิดและเครื่องมือสำหรับภาษาพลศาสตร์ก็ดีพอ
— Gerenuk

1
@ Gerenuk - ฉันไม่มีประสบการณ์เพียงพอกับการพัฒนาที่คล่องแคล่ว (โดยเฉพาะในภาษาไดนามิก) ที่จะให้คำตอบอย่างเป็นทางการ - เป็นลักษณะการ refactoring de - เน้นซ้ายเหมือนกันหรือไม่? โปรดทราบว่าตัวอย่างทั่วไปของกระบวนการ - การพัฒนาโดยอาศัยการทดสอบนั้นสามารถช่วยระบุตำแหน่งที่การปรับโครงสร้างของคุณผิดพลาดและถ้าคุณใช้ความพยายามมากขึ้นในการพูดขั้นตอนการออกแบบคุณอาจไม่จำเป็นต้องใช้ เพื่อ refactor มาก ฉันไม่คิดว่าเทคนิคเฉพาะอย่างใดอย่างหนึ่งเป็นกุญแจสำคัญ - มันเก็บรักษาเครื่องมือครบชุดไว้ใช้งานบ่อยและทำงานร่วมกัน
— Rex Kerr

14

การเปลี่ยนโครงสร้างอัตโนมัติถูกคิดค้นใน Smalltalk ซึ่งเป็นภาษาที่พิมพ์แบบไดนามิก ดังนั้นไม่เป็นไปไม่ได้ที่จะมีการปรับโครงสร้างอัตโนมัติใหม่ในภาษาที่พิมพ์แบบไดนามิก ความยากเพียงใดนั้นขึ้นอยู่กับปัจจัยอื่นนอกเหนือจากวินัยการพิมพ์ C ++ และ Java ถูกพิมพ์แบบสแตติก แต่เครื่องมือการรีแฟคเตอร์มีอยู่จริงสำหรับ Java เท่านั้น Smalltalk ซึ่งมีวิปัสสนาและไวยากรณ์ง่าย ๆ เป็นเครื่องมือที่ดีมากสำหรับการปรับสภาพเครื่องมือ

ในบางวิธีการพิมพ์แบบไดนามิกช่วยให้การปรับโครงสร้างทำได้ง่ายขึ้น หากคุณมีชุดทดสอบที่ดีคุณสามารถมั่นใจได้ว่าการปรับโครงสร้างของคุณจะไม่เสียหาย ฐานรหัสที่พิมพ์แบบไดนามิกมักจะมีขนาดเล็กลง นอกจากนี้ refactorings มีแนวโน้มที่จะส่งผลกระทบต่อรหัสน้อยลง ความพยายามทั้งหมดที่เกี่ยวข้องในการสร้างฐานรหัสแบบไดนามิกใหม่ด้วยตนเองนั้นน้อยกว่าของฐานรหัสแบบคงที่


1
แล้ววิศวกรรมย้อนกลับล่ะ? Smalltalk ต่างจาก Python เกี่ยวกับการพิมพ์หรือไม่? ดูเหมือนว่าเป็นปัญหาที่ยากที่จะอนุมานทุกประเภทใน Python และกำหนดว่าวิธีใดที่เหมือนกันจริงๆและไม่ใช่แค่ชื่อเดียวกัน
— Gerenuk

2
สมอลล์ทอล์คไม่ว่ามากแตกต่างจากงูใหญ่เกี่ยวกับการพิมพ์ มันเป็นอย่างไรอย่างมีนัยสำคัญที่แตกต่างกันเกี่ยวกับการขับรถ เครื่องมือและ IDEs ที่มีอยู่สำหรับสมอลล์ทอล์คมีวิธีที่ดีกว่าที่มีอยู่สำหรับงูใหญ่หรือแม้กระทั่ง C #, C ++ และ Java เหตุผลที่ IDEs สำหรับ Python ไม่ดีนั้นไม่ได้เป็นเพราะ Python นั้นถูกพิมพ์แบบไดนามิกมันก็เป็นเพราะดีว่า IDEs สำหรับ Python นั้นไม่ดี อย่าลืมว่า IDE ที่เรารู้จักในชื่อ Eclipse นั้นเคยถูกเรียกว่า VisualAge สำหรับ Smalltalk หนึ่งครั้ง ชุมชน Smalltalk มีประสบการณ์ 40 ปีในการสร้าง IDE และพวกเขาใช้มันกับ Java
— Jörg W Mittag

@ Gerenuk การพิมพ์ของ Smalltalk ไม่แตกต่างจากงูใหญ่ ในวิธีอื่นเช่นการวิปัสสนาสมอลทอล์คได้จัดเตรียมคุณลักษณะที่เป็นมิตรกับการปรับโครงสร้างอีกครั้ง การอนุมานประเภทในหลามจะต้องใช้งาน แต่ได้ทำไปแล้วดูโครงการ PyPy
— Winston Ewert

1
@WinstonEwert "แต่คุณสามารถ refactor ด้วยตนเองและภาษาแบบไดนามิกทำให้มันค่อนข้างง่าย" - ไม่การปรับโครงสร้างด้วยตนเองไม่ได้ปรับขนาด การสนับสนุนเครื่องมือสำหรับการเปลี่ยนการเปลี่ยนแปลงใหม่ทุกอย่างแม้ในขณะที่การเปลี่ยนสถานะไม่ได้เป็นแบบอัตโนมัติ 100% (ดูตัวอย่างกรณีศึกษาด้านล่าง - programmers.stackexchange.com/a/166594/4334 )
— igouy

1
เกือบทุกจุดใน "การเขียนโปรแกรมแบบไดนามิกของคุณทำให้การปรับโครงสร้างได้ง่ายขึ้น" นั้นเป็นเรื่องน่าสงสัยหรือไม่ใช่เรื่องจริง การเขียนโปรแกรมแบบไดนามิกไม่ได้หมายความว่าคุณมีชุดทดสอบที่ครอบคลุมมากขึ้น แต่มีขนาดใหญ่กว่าเท่านั้น (เนื่องจากบางสิ่งจำเป็นต้องมีการทดสอบที่จะถูกทดสอบแบบคงที่) คุณไม่ได้ให้การสนับสนุนสำหรับ "refactorings มีแนวโน้มที่จะส่งผลกระทบต่อรหัสน้อยลง" (นอกเหนือจาก "โครงการมีขนาดเล็กอยู่แล้ว" ซึ่งน่าจะเป็นจริงเนื่องจากการครอบตัดปัจจุบันของภาษาแบบไดนามิก) และ "ความพยายามที่เกี่ยวข้องกับการปรับโครงสร้างด้วยตนเอง" ดูเหมือนจะผิดถ้าคุณหมายความว่าคุณจะไม่ยอมให้คอมไพเลอร์ช่วยคุณ!
— Rex Kerr

8

การรีแฟคเตอร์ถูกคิดค้นในภาษาแบบไดนามิก เครื่องมือ Refactoring อัตโนมัติถูกคิดค้นในภาษาแบบไดนามิก IDE ถูกประดิษฐ์ในภาษาแบบไดนามิก ระเบียบวิธี Agile จำนวนมากถูกคิดค้นในภาษาแบบไดนามิก

ฉันไม่เห็นปัญหาใด ๆ


"Smalltalk นั้นไม่ได้มีความแตกต่างจากงูใหญ่มากนักเกี่ยวกับการพิมพ์อย่างไรก็ตามมันแตกต่างอย่างมากจากการใช้เครื่องมือ" - บางทีนั่นอาจจะเริ่มเปลี่ยนไปดูjetbrains.com/pycharm/features/index.html
— igouy

3

เพื่อไม่ให้ลืมวิธีการทำงานแบบ "เปรียว" ซึ่งต่อมาได้กลายเป็นที่รู้จักในชื่อExtreme Programming (XP) นั้นถูกสร้างขึ้นในโครงการ Smalltalk (และ Smalltalk นับเป็นภาษา "ไดนามิก")

ต่อไปนี้เป็นกรณีศึกษาการใช้เครื่องมือการปรับโครงสร้างให้ใหม่ที่มาพร้อมกับภาษาที่พิมพ์แบบไดนามิก:

แอปพลิเคชัน Smalltalk ขนาดใหญ่มากได้รับการพัฒนาที่ Cargill เพื่อรองรับการทำงานของลิฟต์เมล็ดพืชและกิจกรรมการซื้อขายสินค้าที่เกี่ยวข้อง แอปพลิเคชันไคลเอนต์ Smalltalk มี 385 windows และกว่า 5,000 คลาส ประมาณ 2,000 คลาสในแอปพลิเคชั่นนี้มีปฏิสัมพันธ์กับกรอบการเข้าถึงข้อมูล (ประมาณปี 1993) เฟรมเวิร์กทำการแมปแอตทริบิวต์ของวัตถุกับคอลัมน์ตารางข้อมูลแบบไดนามิก

การวิเคราะห์พบว่าแม้ว่าการค้นหาแบบไดนามิกจะใช้เวลาดำเนินการไคลเอนต์ 40% แต่ก็ไม่จำเป็น

อินเทอร์เฟซเลเยอร์ข้อมูลใหม่ได้รับการพัฒนาที่จำเป็นต้องใช้ในชั้นธุรกิจเพื่อให้แอตทริบิวต์วัตถุกับการแมปคอลัมน์ในวิธีการเข้ารหัสอย่างชัดเจน การทดสอบแสดงให้เห็นว่าอินเทอร์เฟซนี้มีขนาดของคำสั่งเร็วขึ้น ปัญหาคือวิธีการเปลี่ยนผู้ใช้ชั้นข้อมูล 2,100 คนของชั้นข้อมูล

แอปพลิเคชันขนาดใหญ่ภายใต้การพัฒนาไม่สามารถตรึงรหัสในขณะที่การเปลี่ยนแปลงของอินเทอร์เฟซถูกสร้างและทดสอบ เราต้องสร้างและทดสอบการแปลงในสาขาคู่ขนานของที่เก็บรหัสจากกระแสการพัฒนาหลัก เมื่อการแปลงได้รับการทดสอบอย่างสมบูรณ์แล้วจะถูกนำไปใช้กับสตรีมโค้ดหลักในการดำเนินการครั้งเดียว

พบน้อยกว่า 35 ข้อบกพร่องในการเปลี่ยนแปลง 17,100 ข้อบกพร่องทั้งหมดได้รับการแก้ไขอย่างรวดเร็วในระยะเวลาสามสัปดาห์

หากการเปลี่ยนแปลงทำด้วยตนเองเราคาดว่าจะใช้เวลา 8,500 ชั่วโมงเทียบกับ 235 ชั่วโมงเพื่อพัฒนากฎการเปลี่ยนแปลง

งานเสร็จสมบูรณ์ใน 3% ของเวลาที่คาดหวังโดยใช้กฎการเขียนซ้ำ นี่คือการปรับปรุงโดย 36 ปัจจัย

จาก“ การแปลงชั้นข้อมูลแอปพลิเคชัน” Will Loew-Blosser OOPSLA 2002

นอกจากนี้ - "เครื่องมือสำหรับการเปลี่ยนแปลงที่เป็นไปไม่ได้ - ประสบการณ์ด้วยเครื่องมือสำหรับการเปลี่ยนโปรแกรม Smalltalk ขนาดใหญ่"


1

หลักการของคุณคิดว่าฟังดูถูกต้องแล้ว

ภาษาที่พิมพ์อย่างรุนแรงเช่น C # เป็นตัวเลือกที่ดีสำหรับฐานรหัสที่ต้องการการแฟคตอริ่งใหม่อย่างต่อเนื่อง เครื่องมือการแฟคตอริ่งส่วนใหญ่โดยทั่วไป (เช่น Resharper, JustCode และอื่น ๆ ) ในตลาดมีประสิทธิภาพมากในภาษาการเขียนโปรแกรมแบบคงที่

โครงการโลกแห่งความจริงบอกอะไรเกี่ยวกับการใช้ภาษาที่พิมพ์แบบไดนามิกสำหรับวิธีการแบบเปรียว

สำหรับทีมพัฒนาที่ใช้วิธีการ Agile / Scrum มันมีประโยชน์มาก (สำคัญยิ่ง) เพื่อให้มีชุดเครื่องมือกู้คืนแฟคตอริ่งที่ดีภายใต้ชุดเกราะ มิฉะนั้นการเปลี่ยนแปลงอย่างกระทันหันในการวิ่งที่กำลังจะเกิดขึ้นอาจเป็นฝันร้ายที่จะต้องแก้ไขหรือออกแบบใหม่

ดังนั้นวิธีการแบบเปรียวจึงไม่ให้ประโยชน์กับภาษาที่พิมพ์แบบคงที่หรือแบบไดนามิกครั้งเดียว สิ่งที่ให้คือวิธีการวนซ้ำเพื่อสร้างแอปพลิเคชันที่มั่นคง


4
ภาษาแบบไดนามิกมีเครื่องมือการเปลี่ยนโครงสร้างอัตโนมัติแบบอัตโนมัติมานานก่อนที่ C # จะปรากฏขึ้นและเมื่อ Notepad ยังคงเป็น Java IDE ที่ทรงพลังที่สุด
— Jörg W Mittag

4
คำตอบนี้ไม่ได้รับการสนับสนุนอย่างสมบูรณ์จากประสบการณ์ของฉัน ภาษาแบบไดนามิกมักจะได้เร็วขึ้นที่จะทำสิ่งที่อยู่ในกว่าธรรมดาคนพิมพ์แบบคงที่ (ผมได้มีการเรียนรู้ Haskell หรือ ML หรือสิ่งที่ต้องการบางครั้งนั้น) พวกเขายังเร็วกว่าเดิมมากในการปรับเปลี่ยนหากจำเป็นโดยฉับพลันซึ่งนำไปสู่ข้อสรุปของฉันว่า Common LISP เป็นภาษาที่ดีที่สุดเมื่อคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่ ยิ่งกว่านั้นคุณคิดว่าการปรับโครงสร้างเริ่มต้นที่ใด
— David Thornley

1
ทำไมคุณถึงคิดเช่น javascript เป็นภาษาแบบไดนามิก แต่ Re-sharper ไม่ทำงานที่ลื่นเหมือนที่ทำกับ C # ประการที่สองฉันไม่ได้พูดว่า "ภาษาแบบไดนามิกช้าลงในการทำสิ่งต่าง ๆ "
— Yusubov

จากคนที่ทำให้คุณ IntelliJ IDEA - PyCharm - "การเปลี่ยนชื่อการเปลี่ยนสถานะใหม่ช่วยให้สามารถทำการเปลี่ยนแปลงรหัสสากลได้อย่างปลอดภัยและทันทีการเปลี่ยนแปลงภายในไฟล์จะดำเนินการในสถานที่การทำ Refactorings ทำงานในโครงการ Python และ Django แบบธรรมดา ฟิลด์ / ค่าคงที่และอินไลน์โลคัลสำหรับการปรับปรุงโครงสร้างโค้ดภายในเมธอด, วิธีแยกเพื่อแยกวิธีที่ยาวกว่า, แยกซูเปอร์คลาส, ดันขึ้น, ดึงลงและย้ายเพื่อย้ายเมธอดและคลาส " jetbrains.com/pycharm/features/index.html
— igouy

@igouy ฉันหมายถึง Resharper และ JustCode ในคำตอบของฉัน ดังนั้นจึงเป็นเรื่องจริงสำหรับบริบทที่มีการอ้างอิง
— Yusubov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.