โปรแกรมเมอร์ทำอะไรก่อนขอบเขตตัวแปรซึ่งทุกอย่างอยู่ในระดับโลก?


40

ดังนั้นฉันต้องจัดการกับภาษา archiac ที่ดูเหมือน (เรียกว่า PowerOn) ที่ฉันมีวิธีการหลักประเภทข้อมูลไม่กี่เพื่อกำหนดตัวแปรด้วยและมีความสามารถในการมีขั้นตอนย่อย (วิธีการโมฆะเป็นหลัก) ที่ไม่กลับประเภท และไม่ยอมรับการโต้แย้งใด ๆ ปัญหาที่นี่คือทุกสิ่งที่เป็นระดับโลก ฉันได้อ่านภาษาเหล่านี้แล้ว แต่หนังสือส่วนใหญ่ใช้คำว่า "โอเคเราใช้ม้าและ cariage แต่ตอนนี้ที่นี่เป็นรถดังนั้นเรามาเรียนรู้วิธีการทำงานกับสิ่งนั้น!" เราไม่เคยจะมีชีวิตอีกวันนั้น" . ฉันต้องยอมรับความคิดจะดิ้นรนที่จะคิดนอกขอบเขตและขอบเขต

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

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


71
พวกเขาสวดอ้อนวอนมาก
Robert Harvey

15
ฉันสามารถจินตนาการชื่อตัวแปรบ้าจำนวนมากที่ขอบเขตโดยประมาณ - bob_dog_fur_colourฯลฯ ... เพื่อลองและลดโอกาสในการตีชื่อเดียวกัน
Latty

12
พวกเขาเขียนโปรแกรมที่มีขนาดเล็กลงและมีข้อบกพร่องมากมาย
Charles E. Grant

12
@ Lattyware จริง ๆ แล้วย้อนกลับไปในสมัยก่อนคุณมีข้อ จำกัด มากในการอธิบายชื่อตัวแปรของคุณ บางภาษาอนุญาตให้ใช้ชื่อตัวแปรอักขระ 1 หรือ 2 ตัวเท่านั้นบางภาษาอนุญาตให้คุณมากถึง 8 มันดูด แต่เราไม่ทราบว่ามันดูดมากแค่ไหน มันทำให้คอมไพเลอร์บีบลงในหน่วยความจำในจำนวนที่ จำกัด
Charles E. Grant

17
พวกเขาคิดค้นที่ดีกว่าการเขียนโปรแกรมภาษา ...
Wim

คำตอบ:


44

คุณจะต้องใช้เทคนิคการทำบัญชีทางจิตใจ (แบบแผนการตั้งชื่อ ฯลฯ ) เพื่อให้ตรง นอกจากนี้เอกสารเอกสารเอกสาร เนื่องจากตัวแปรทั้งหมดเป็นแบบกลมจึงมีเอกสารฉบับเดียวที่แสดงรายการทั้งหมดหากคุณทำได้

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

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

ฉันเคยเห็นสิ่งต่าง ๆ มาก่อนแล้วด้วยตัวระบุที่ยาว แต่ตัวระบุที่มีเฉพาะใน 8 อักขระแรกเท่านั้น ดังนั้นคุณอาจมี RonnyRayGun และ RonnyRayBlaster และพวกเขาเป็นตัวแปรเดียวกัน ในกรณีเช่นนี้ฉันขอแนะนำให้คงชื่อตัวแปรไว้ภายใต้ข้อ จำกัด 'ที่ไม่ซ้ำกัน' เพื่อให้คุณมีโอกาสน้อยที่จะชนกันโดยไม่ตั้งใจ


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

53

พจนานุกรมข้อมูล

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

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

ปัญหานี้ก็ปรากฏขึ้นเมื่อโปรแกรมเมอร์ต้องสร้างระบบขนาดใหญ่ใน BASIC รุ่นแรก มันปรากฏตัวสำหรับฉันเป็นการส่วนตัวในขณะที่ใช้ผู้จัดการ "ฐานข้อมูล" แบบดั้งเดิมที่เรียกว่า Info (ผลิตภัณฑ์ของ Henco, Inc. ของ New Jersey - หายไปนานแล้ว!) ทั้งสองภาษามีคำศัพท์ชื่อตัวแปรที่ จำกัด มาก


ฉันอยู่ในสถานการณ์ที่คล้ายกันมากเพราะเป็นผู้จัดการ "ฐานข้อมูล" มากกว่าที่ภาษาจะเชื่อมต่อกับฐานข้อมูลโดยตรงพร้อมกับการเขียนโปรแกรมบางอย่างเช่นการทำงาน สิ่งนี้มีประโยชน์มาก
Chad Harrison

1
ที่ทำให้ฉันนึกย้อนกลับไปเมื่อฉันได้เรียนรู้พื้นฐานและตัวแปรไม่สามารถมีชื่อยาวกว่าตัวละครสองตัวและติดตามพวกเขาในโปรแกรมที่มีขนาดใหญ่ ...
Kevin Rubin

@KevinRubin อย่าเตือนฉัน อารู้สึกเจ็บปวดมากขึ้นตามที่ Bill Clinton เคยพูด ...
John R. Strohm

8

การเพิ่มขึ้นของภาษาการเขียนโปรแกรมที่มีขอบเขตบล็อกใกล้เคียงกับการกำเนิดของเครื่องจักรที่เร็วขึ้นและมีขนาดใหญ่ขึ้นและนั่นก็ไม่ใช่เรื่องบังเอิญ คอมพิวเตอร์ยุคแรก ๆ มีหน่วยความจำ RAM เป็น MB, kB หรือแม้แต่เป็นไบต์ มีเพียงโอกาสที่จะได้ไม่ต้องมีตัวแปรมากมายที่พวกเขาจะสับสนเมื่อโปรแกรมมีขนาดใหญ่เพราะโปรแกรมที่ไม่เคยมีขนาดใหญ่ ความก้าวหน้าในการเขียนโปรแกรมภาษามักเกิดขึ้นเมื่อคนจำได้ว่านิสัยการเขียนโปรแกรมเก่าของพวกเขาไม่ได้เพิ่มขึ้นเมื่อเวทีมีขนาดใหญ่กว่ามาก ขอบเขตบล็อกถูกประดิษฐ์ขึ้นเป็นกลไกการป้องกันสำหรับโปรแกรมเมอร์กับหน่วยความจำ จำกัด ของตัวเอง

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


ไกลแค่ไหนที่คุณกำลังพูดถึง ฉันได้เห็นมินิคอมพิวเตอร์สองสามคนจากต้นปี 80 ที่มี 'ดาต้าพูล' (เช่นรายการตัวแปรทั่วโลก) ที่มีป้ายกำกับเกิน 60K
Evan Plaice

-1: ในช่วงแรก ๆ คุณไม่เพียง แต่จ่ายค่าเช่ารายเดือนเพื่อให้สามารถใช้งานคอมพิวเตอร์ได้คุณจ่ายค่า CPU รอบและหน่วยความจำที่โปรแกรมของคุณใช้ ซอฟต์แวร์อยู่ไกลจากฟรีและใช้งานซอฟต์แวร์แม้แต่น้อย
mattnz

1
@mattnz: ก่อนหน้านี้บางครั้งซอฟต์แวร์มักจะมาพร้อมกับซอฟต์แวร์ซึ่งค่อนข้างแตกต่างจากฟรี โดยทั่วไปแล้วองค์กรที่ต้องการคอมพิวเตอร์จะซื้อหรือเช่าและไม่จ่ายเงินสำหรับการใช้งานเครื่องถึงแม้ว่าผู้ใช้แต่ละคนจะถูกเรียกเก็บเงินตามปกติ ฉันยังงงงวยกับคำกล่าวอ้างของ OP ว่าคนไม่คาดหวังที่จะเขียนซอฟต์แวร์ของตัวเองเพราะนั่นไม่ใช่ประสบการณ์ของฉัน หากคุณสามารถซื้อคอมพิวเตอร์คุณสามารถซื้อเจ้าหน้าที่พัฒนาและมีซอฟต์แวร์กระป๋องไม่มากนัก
David Thornley

ปัญหาเกี่ยวกับการเขียนโปรแกรมขอบเขตเดียวได้รับการยอมรับค่อนข้างเร็วก่อนที่คอมพิวเตอร์จะมีหน่วยความจำหลายเมกะไบต์ ALGOL ภาษาแรกที่มีคำศัพท์ขอบเขตปรากฏขึ้นในปี 1958
วินไคลน์

4

เมื่อหลายปีก่อน (ความทรงจำที่เดือดดาล :))

ฉันไม่รู้ภาษาที่คุณอ้างถึง แต่โดยทั่วไปเราปรับให้เข้ากับสิ่งที่เรามี มันไม่ใช่เรื่องใหญ่จริง ๆ คุณจำเป็นต้องให้ความสำคัญกับชื่อ var ซึ่งมักมีอยู่ (ในรูปแบบย่อในจำนวนวันที่มีค่าเป็นไบต์) อ้างอิงถึง sub หรือฟังก์ชั่นเช่นmIORead1ถ้าคุณมี handler อ่านข้อมูลจากไฟล์ 1 หรือคุณมี vars เคาน์เตอร์เช่น i, j, k ฯลฯ โดยระบบของคุณเองคุณรู้ว่าสิ่งที่พวกเขาสำหรับถ้าพวกเขาสามารถนำมาใช้ซ้ำและอื่น ๆ มันไม่ยอมใครง่ายๆ (ไม่มีหมวกกันน็อกหรือถุงมือย้อนหลัง) :-)


3

นี่คล้ายกับการเขียนโปรแกรม PLC แม้ว่า PLC สมัยใหม่จะอนุญาตให้คุณมี "แท็ก" (ตัวแปร aka) ที่อยู่ภายในโปรแกรม ยังมีอีกหลายคนที่ตั้งโปรแกรมโดยใช้แท็กทั่วโลกทั้งหมด

ฉันได้พบว่าถ้าคุณจะทำเช่นนั้นคุณต้องใช้หลักการตั้งชื่อที่มีโครงสร้าง ตัวอย่างเช่น: Motor1_DriveContactor_Run. ถ้าภาษาของคุณที่เกิดขึ้นกับโครงสร้างการสนับสนุน (บางครั้งเรียกว่าประเภทที่ผู้ใช้กำหนด) Motor[1].DriveContactor.Runแล้วคุณยังสามารถใช้เหล่านั้นเพื่อสร้างลำดับชั้นของข้อมูลที่มีโครงสร้างเช่น:

นั่นทำให้ทุกอย่างเป็นระเบียบและโดยปกติแล้ว Intellisense นั้นดีพอที่จะช่วยคุณได้


2

ฉันเรียนรู้ที่จะเขียนโปรแกรมในภาษาที่เรียกว่า Authorware ซึ่งทุกอย่างเป็นสากล โชคดีที่มันมีอาร์เรย์และหลังจากบางจุดที่เรียกว่ารายการซึ่งคล้ายกับวัตถุทั่วไป

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

Authorware ได้รับการออกแบบสำหรับ eLearning ดังนั้นหนึ่งในไอคอนที่เรามีคือหน้า หน้าจะแนบมากับ Framework ดังนั้นสำหรับหน้า 1 เราจะดูใน Array ที่ index 1 (Authorware คือ 1-indexed) และดึงข้อมูลสำหรับหน้านั้นออกมาซึ่งจะถูกเก็บรายการที่จะทำหน้าที่เป็นวัตถุหลอก หน้านั้นจะมีตรรกะที่จะดึง "คุณสมบัติ" ของวัตถุตามชื่อ หากคุณไม่มีอะไรเหมือน Objects แต่คุณมี Arrays คุณสามารถกำหนดระเบียบว่าข้อมูลจะไปที่ใด

มันไม่แตกต่างจากที่เราทำเมื่อเราดึงข้อมูลจากฐานข้อมูลและทำการฉีดการพึ่งพายกเว้นว่าทุกสิ่งทุกอย่างนั้นมีอยู่ในระดับโลกจริงๆและคุณเพียงแค่เลือกที่จะใส่ทุกอย่างลงในกล่องเล็ก ๆ เกี่ยวข้องกับตอนนี้

ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณพยายามทำและสิ่งที่ภาษาของคุณสนับสนุนสิ่งนี้อาจช่วยให้คุณแบ่งสิ่งต่าง ๆ ออกเป็นส่วนที่จัดการได้ง่ายขึ้น


ฉันยังทำงานร่วมกับ Macromedia Authorware, @ amy-blankenship ฉันจำไม่ได้ว่าเป็นรุ่นอะไรเมื่อฉันใช้งานครั้งล่าสุดบางทีอาจเป็น 3. มันถูกแทนที่ด้วย Flash / Showckwave หรือยังมีอยู่หรือไม่
Tulains Córdova

พวกเขาต่างกัน Macromedia ทำให้เกิดความสับสนในเวอร์ชั่น 5 (ทั้งคู่) โดยการเรียกทุกอย่างที่ Shockwave รวมถึงผู้กำกับเมื่อจัดทำเว็บ Adobe ยุติการใช้ Authorware หลังจากการซื้อ Flash ยังคงดำเนินต่อไป
Amy Blankenship

1

เมื่อตอนที่ฉันอยู่ที่มหาวิทยาลัยเราได้รับการสอนเรื่อง "The Global Variable Problem" - ชุดของข้อบกพร่องและปัญหาการบำรุงรักษาโค้ดที่เกิดจากตัวแปรทั่วโลกมากมาย

ตัวแปรบางตัวมีอันตรายมากกว่าตัวแปรอื่น ๆ

ปลอดภัย : ตัวแปรที่ไม่ส่งผลกระทบต่อ flow-of-control เช่น LastName

อันตราย : ตัวแปรใด ๆ ที่มีผลต่อการควบคุมการไหลของโปรแกรมเช่น DeliveryStatus

อันตรายที่สุดก่อน:

  • สถานะการรวม (โหมดและโหมดย่อย)
  • มูลค่ารวม (รวม, ผลรวมย่อย)
  • สถานะเดียว (โหมด)
  • ค่าเดียว (นับ)

เพื่อหลีกเลี่ยง "ปัญหาตัวแปรส่วนกลาง" คุณต้อง

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

ในการจัดโครงสร้างโค้ดของคุณเมื่อไม่มีโครงสร้างในภาษาให้ใช้ความคิดเห็นและแบบแผนการตั้งชื่อ:

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

ไม่รู้ว่าพวกเขาทำอย่างไร

แต่ผมคิดว่าภาษา OOP ทันสมัยมีปัญหาที่คล้ายกันมากเกี่ยวกับการปะทะกันตั้งชื่อ

การแก้ปัญหาคือการใช้namespace มันเป็นแนวคิดที่เป็นนามธรรม แต่นำไปใช้อย่างกว้างขวางโดยการใช้งานหลายอย่าง (แพ็คเกจ Java,. NET namespace, โมดูล Python)

หากภาษาที่คุณใช้ไม่มีข้อ จำกัด แคบเกินไปเกี่ยวกับการตั้งชื่อความยาวคุณสามารถใช้เนมสเปซกับการตั้งชื่อตัวแปรที่ดี

ดังนั้นชื่อตัวแปรจึงแสดงถึงขอบเขตตัวแปร

order_detail_product_codeพยายามที่จะกำหนดรูปแบบการตั้งชื่อเช่นนี้ order_detail_product_unit_price, หรือสำหรับเคาน์เตอร์ชั่วคราวหรือสัญญาแลกเปลี่ยน: tmp_i, tmp_swap.


0

ในภาษามีตัวแปรทั้งหมดอยู่ในระดับโลก (ฉันได้ใช้สองสามครั้ง) เราเคยใช้แบบแผนการตั้งชื่อตัวแปร ตัวอย่างเช่นถ้าฉันต้องการใช้ตัวแปรเป็น global ฉันอาจใช้คำนำหน้า "m_" หรือ "_" แน่นอนว่าสิ่งนี้ยังต้องอาศัยนักพัฒนาที่จะมีวินัยนี้

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