กลยุทธ์ในการติดตามการเปลี่ยนแปลงภาษา (Python)


16

การเขียนโค้ดที่จะยังคงทำงานเป็นปีนับจากนี้

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

ฉันใช้ Python เป็นตัวอย่าง แต่ปัญหาไม่ได้ จำกัด เฉพาะ Python โดยเฉพาะ

เอกสารเกี่ยวกับปัญหาความเข้ากันได้ของ Python

ในกรณีของ Python มีเอกสารหลายฉบับที่สรุปนโยบายสำหรับการเปลี่ยนแปลงย้อนหลังที่เข้ากันไม่ได้

PEP-5

ตามPEP 5 :

ต้องมีช่วงเวลาการเปลี่ยนแปลงอย่างน้อยหนึ่งปีระหว่างการเปิดตัว Python และการปล่อยของเวอร์ชันที่เข้ากันไม่ได้ย้อนหลัง ผู้ใช้จะมีเวลาอย่างน้อยหนึ่งปีในการทดสอบโปรแกรมของพวกเขาและโยกย้ายพวกเขาจากการใช้โครงสร้างที่เลิกใช้แล้วไปยังตัวเลือกอื่น

โดยส่วนตัวแล้วฉันคิดว่าหนึ่งปีนั้นค่อนข้างสั้น หมายความว่าฉันอาจเขียนโค้ดและ 1 and ปีจากนี้มันจะไม่ทำงานอีกต่อไป

PEP 291

PEP 291มีรายการแนวทางที่ไม่สมบูรณ์ที่ควรหลีกเลี่ยงเพื่อรักษาความเข้ากันได้ย้อนหลัง อย่างไรก็ตามมันเกี่ยวข้องกับ Python 2.x เท่านั้น เนื่องจาก Python 2.7 เป็นรุ่นสุดท้ายในซีรีย์ 2.x และ Python 2.7 เป็นเพียงการแก้ไขข้อบกพร่องเท่านั้น PEP นี้จึงเป็นที่สนใจในอดีตเท่านั้น

PEP 387

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

นอกจากนี้ยังมีกฎหลายข้อที่คุณสามารถอนุมานได้ว่าเป็นเรื่องจริงส่วนใหญ่เวลา: อย่าเรียกสิ่งที่เริ่มต้นด้วย"_"อย่าลิงอะไรปะไม่ใช้การเปลี่ยนคลาสแบบไดนามิกบนวัตถุจากคลาสอื่นนอกเหนือจากของคุณเอง ไม่ต้องอาศัยความลึกของลำดับชั้นการสืบทอด (ตัวอย่างเช่นไม่ใช่".__bases__[0].__bases__[0]" ) ตรวจสอบให้แน่ใจว่าการทดสอบของคุณทำงานโดยไม่ต้องใช้ DeprecationWarnings โปรดระลึกถึงความขัดแย้งของเนมสเปซที่เป็นไปได้เมื่อเพิ่มแอตทริบิวต์ไปยังคลาสที่สืบทอดจากไลบรารีอื่น ๆ ฉันไม่คิดว่าทุกสิ่งเหล่านี้จะถูกเขียนลงในที่เดียว

นอกจากนี้ยังมีบางจุดเกี่ยวกับ "ทุ่งเหมือง" (คุณสมบัติใหม่ที่มีแนวโน้มที่จะเปลี่ยนแปลง) และ "พื้นที่แช่แข็ง" (API ที่ขายดีมากรับประกันได้ว่าจะไม่เปลี่ยนแปลง) การอ้างอิง Antoine Pitrou :

ฉันคิดว่าควรกำหนด "พื้นที่แช่แข็ง" ในเชิงบวก (API สาธารณะอย่างชัดเจนและรับประกันพฤติกรรมอย่างชัดเจน) แทนที่จะเป็นเชิงลบ (เขตข้อมูลเหมืองชัดเจน) มิฉะนั้นเราจะลืมใส่สิ่งที่สำคัญบางอย่างในเขตที่วางทุ่นระเบิดและถูกกัดในภายหลังเมื่อเราจำเป็นต้องเปลี่ยนสิ่งเหล่านั้นในทางกลับกันไม่เข้ากัน

ดูเหมือนจะไม่มีข้อสรุปใด ๆ จากกระทู้นี้ แต่ใกล้เคียงกับแกนหลักของสิ่งที่ฉันกำลังมองหา เธรดนั้นมีอายุเกือบสี่ปีดังนั้นอาจมีการเปลี่ยนแปลงหรือปรับปรุงสถานการณ์ รหัสประเภทใดที่จะอยู่รอดและรหัสประเภทใดที่บอบบางกว่า

แนวทางการย้าย

นอกเหนือจากเอกสารที่ระบุไว้ด้านบนแล้ว Python แต่ละเวอร์ชันยังมีแนวทางในการย้ายพอร์ต : เปลี่ยนเป็น Python 3.2 , เปลี่ยนเป็น Python 3.3เป็นต้น

มีประโยชน์เข้ากันได้

PEP 3151แนะนำผมให้แนวคิดของการทำงานร่วมกันที่มีประโยชน์ ในคำพูดของฉันเองสิ่งนี้ทำให้เกิดความคิดขึ้นมาว่าหากโค้ดเป็นภาษาที่นักพัฒนาเขียนอย่างระมัดระวังจะต้องระมัดระวังในการรักษาความเข้ากันได้ ไม่ได้กำหนดความเข้ากันได้ที่เป็นประโยชน์จริง ๆแต่ฉันคิดว่ามันคล้ายกับความคิดที่ฉันยกมาจากการอภิปราย PEP 387 ด้านบน

จากมุมมองของโปรแกรมเมอร์

ในฐานะโปรแกรมเมอร์ฉันรู้ว่า Python จะเปลี่ยนไปในอนาคตและผู้คน - ตัวฉันเองที่สะดุดตาที่สุด - จะพยายามเรียกใช้โค้ดของฉันหลายปีต่อจากนี้ในเวอร์ชัน Python ที่เป็นหนึ่งสองหรือสามรุ่นรอง ไม่ใช่ทุกอย่างที่จะเข้ากันได้และอันที่จริงมันง่ายที่จะเกิดขึ้นกับรหัสที่จะล้มเหลว (ฉันเคยพบรหัสที่ระบุif sys.version[:3] != '2.3': print 'Wrong version, exiting') สิ่งที่ฉันกำลังมองหาคือชุดของแนวทางเกี่ยวกับสิ่งที่ต้องทำและสิ่งที่ ไม่ ควรทำเพื่อเพิ่มโอกาสที่รหัสของฉันจะยังคงทำงานไม่เปลี่ยนแปลงในอนาคต

มีแนวทางดังกล่าวหรือไม่? ฉันจะเขียนโค้ด Python ที่จะยังคงทำงานได้ในอนาคตได้อย่างไร

คำถามของฉันที่เกี่ยวข้องทั้งแกนหลามไปยังห้องสมุดมาตรฐาน แต่ยังใช้กันทั่วไป add-on ห้องสมุดโดยเฉพาะอย่างยิ่งnumpy, ,scipymatplotlib


แก้ไข : ถึงตอนนี้คำตอบสองข้อเกี่ยวข้องกับ python2 กับ python3 นี่ไม่ใช่สิ่งที่ฉันหมายถึง ฉันรู้เกี่ยวกับเครื่องมือในการโยกย้ายจาก Python2 ไปยัง Python3 คำถามของฉันที่เกี่ยวข้องกับการเปลี่ยนแปลงของภาษายังมาไม่ถึง เราสามารถทำได้ดีกว่าลูกบอลคริสตัลในการค้นหาแนวทางการเข้ารหัสที่มีเสถียรภาพมากขึ้น ตัวอย่างเช่น:

  • import moduleเป็นหลักฐานในอนาคตมากกว่าfrom module import *เพราะหลังสามารถแบ่งรหัสหากmoduleขยายฟังก์ชั่น / คลาสใหม่

  • การใช้วิธีการที่ไม่ได้จดทะเบียนอาจพิสูจน์ได้ในอนาคตน้อยกว่าการใช้วิธีการที่ทำเป็นเอกสารเนื่องจากสิ่งที่ไม่ได้จดทะเบียนอาจเป็นสัญญาณบ่งบอกถึงสิ่งที่ไม่มั่นคง

มันเป็นคำแนะนำการเขียนโค้ดเชิงปฏิบัติแบบนี้ที่ฉันตามหา เนื่องจากเป็นเรื่องเกี่ยวกับปัจจุบัน→อนาคตเราสามารถ จำกัด ตัวเองเป็น Python3 ได้เพราะ Python2 จะไม่เปลี่ยนแปลงอีกต่อไป

คำตอบ:


13

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

ดังนั้นฉันไม่สามารถให้รายการสิ่งที่ต้องทำหากคุณติดตามพวกเขาจะรับประกันความสำเร็จ แต่สิ่งที่คุณทำได้คือลดความเสี่ยงของการแตกหักในอนาคตและลดผลกระทบ Pythonist ที่มีความรู้มากขึ้นจะสามารถให้คำแนะนำเฉพาะกับ Python ได้มากขึ้นดังนั้นฉันจะต้องเป็นคนทั่วไปมากกว่านี้:

  • เขียนการทดสอบหน่วย แม้แต่สิ่งที่คุณรู้ว่าไม่ต้องการ

  • การใช้ห้องสมุดและเทคโนโลยีที่ได้รับความนิยม / ออกแบบมาอย่างดี / มีเสถียรภาพและหลีกเลี่ยงไม่ได้รับความนิยม

  • หลีกเลี่ยงการเขียนโค้ดที่ใช้ประโยชน์จากรายละเอียดการใช้งาน รหัสไปยังอินเตอร์เฟสไม่ใช่การนำไปใช้งาน รหัสกับการใช้งานหลาย ๆ อินเทอร์เฟซเดียวกัน ตัวอย่างเช่นเรียกใช้รหัสของคุณใน CPython, Jython และ IronPython และดูว่าเกิดอะไรขึ้น สิ่งนี้จะให้ความคิดเห็นที่ดีเกี่ยวกับรหัสของคุณ สิ่งนี้อาจไม่เป็นประโยชน์สำหรับ Python3 - ล่าสุดฉันได้ยินมาว่าการใช้งานบางอย่างยังคงอยู่ใน Python2

  • เขียนโค้ดที่ง่ายและชัดเจนที่ชัดเจนเกี่ยวกับสมมติฐานของมัน

  • เขียนโค้ดแบบแยกส่วนได้ หากรหัสบางอย่างต้องทำสิ่งที่อันตราย (ในความหมายที่พิสูจน์ได้ในอนาคต) ให้แยกรหัสนั้นแม้ว่าจะต้องมีการเปลี่ยนแปลงรหัสที่เหลือก็จะไม่ทำงาน

  • มีสเปคของรูปแบบบางอย่าง สิ่งนี้คล้ายกับประเด็นเกี่ยวกับการทดสอบหน่วยถ้าคุณใช้การทดสอบเป็นสเป็คและอินเทอร์เฟซซึ่งสามารถใช้เป็นสเปคได้ (ฉันหมายถึงอินเทอร์เฟซในแง่ทั่วไปไม่ใช่ความหมายคำหลัก Java)

การทำสิ่งต่าง ๆ เหล่านี้อาจ / จะเพิ่มปริมาณงานที่คุณต้องทำ ฉันคิดว่ามันสมเหตุสมผล - มีประเด็นมากมายที่สามารถเขียนโค้ดที่ดีซึ่งค่อนข้างยาก (ในความคิดของฉัน) บางครั้งคุณอาจต้องละเมิดคำแนะนำเหล่านี้ นั่นเป็นที่ยอมรับอย่างสมบูรณ์ แต่ต้องระวังค่าใช้จ่าย

มันยอดเยี่ยมมากที่ทีม Python กำลังคิดเกี่ยวกับสิ่งนี้และแน่นอนว่าพวกเขามีความสามารถและมีทักษะมากกว่าที่ฉันเคยเป็น ถึงกระนั้นฉันก็คาดว่าจะมี 100% ที่รหัสของใครบางคนจะหยุดทำงานตามที่ต้องการเมื่อมีการอัพเกรด Python


4

มันเรียกว่าการจัดการการกำหนดค่า หากระบบไม่เคยเปลี่ยนก็ไม่ควรหยุด ดังนั้นอย่าเปลี่ยนระบบ กังวลเกี่ยวกับ Python ใหม่หรือไม่? อย่าอัปเกรด กังวลเกี่ยวกับไดรเวอร์อุปกรณ์ใหม่หรือไม่ อย่าอัปเกรด กังวลเกี่ยวกับแพตช์ Windows หรือไม่ ...


0

สำหรับ Python 2 -> Python 3 มีการติดตั้งไลบรารี Python 2to3ไว้แล้ว (มาพร้อมกับแพ็คเกจ Python ดั้งเดิม)

หลังจากนั้นไม่นานหลังจากที่มีการเปิดตัวเวอร์ชั่นใหม่ควรมีไลบรารี่ที่คล้ายกันซึ่งมาพร้อมกับเวอร์ชั่นใหม่แต่ละอัน อย่างไรก็ตามตามที่ Martijn ระบุไว้ไลบรารีเช่นนี้จะเปิดให้ใช้งานในรุ่นหลักเท่านั้น (เช่นเวอร์ชัน 3.0) แต่ไม่ใช่สำหรับรุ่นรอง (เช่น 3.2) อย่างไรก็ตามระหว่าง 3.0 ถึง 3.2 (หรือรุ่นรองอื่น ๆ ) ไม่ควรมีปัญหาความเข้ากันได้ดังนั้นการแปลงเป็นเวอร์ชั่น 3.0 ควรจะใช้ได้

นอกจากนี้ฉันขอแนะนำให้คุณดูคำถามนี้


1
ไม่ 2to3 ช่วยให้คุณอัปเกรดรหัสผ่านช่องว่างเวอร์ชันหลักเท่านั้น ไม่มีไลบรารี่ (จำเป็น) ในการอัพเกรดโค้ดข้ามรุ่นรอง
Martijn Pieters

@MartijnPieters รุ่นรองไม่ควรมีปัญหาความเข้ากันได้เนื่องจากไม่ควรมีการเปลี่ยนแปลงมากเกินไป หากมีปัญหาความเข้ากันได้และการเปลี่ยนแปลงที่มีขนาดใหญ่รุ่นใหม่ที่สมบูรณ์ควรได้รับการปล่อยตัว

0

ฉันไม่มีอะไรเพิ่มอีกมาก "โปรแกรมสำหรับ 2 และใช้ 2to3" ดูเหมือนจะเป็นสิ่งที่เพิ่มเข้ามาทั่วอินเทอร์เน็ตเมื่อไม่นานมานี้ อย่างไรก็ตามมีบางสิ่งที่คุณควรดู:

มันเรียกว่าหก (หน้า pypi) มันเป็นห้องสมุดหลามที่อุทิศให้กับการช่วยเขียนโค้ดที่ทำงานทั้งสองไพ ธ อน 2 และไพ ธ อน 3 ฉันเคยเห็นมันใช้ในโครงการหลายโครงการในขณะที่พินิจพิเคราะห์รอบเน็ต


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