การแยกรหัสและข้อมูลกลายเป็นวิธีปฏิบัติได้อย่างไร


29

โปรดอ่านคำถามอย่างระมัดระวัง: จะถามว่าไม่ว่าทำไม

ฉันเพิ่งเจอคำตอบนี้ซึ่งแนะนำให้ใช้ฐานข้อมูลเพื่อเก็บข้อมูลที่ไม่เปลี่ยนรูปแบบ:

ดูเหมือนว่าตัวเลขเวทมนต์มากมายที่คุณอธิบายโดยเฉพาะอย่างยิ่งหากเป็นส่วนที่ขึ้นกับข้อมูลจริง ๆ ไม่ใช่รหัส [... ] มันอาจหมายถึงฐานข้อมูลประเภท SQL หรืออาจหมายถึงไฟล์ข้อความที่จัดรูปแบบ

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

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

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

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

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

1: ถ้าใครสามารถสร้างความแตกต่าง ฉันกำลังมองคุณโปรแกรมเมอร์เสียงกระเพื่อม


5
โปรดฝัง html & css ทั้งหมดในภาษาที่คุณเลือก
JeffO

3
ฉันคิดว่าสิ่งที่ผู้เขียนอ้างหมายถึงคือตัวเลขเวทมนตร์ไม่เปลี่ยนรูปจริงๆ
Pieter B

4
ไม่มีอะไรผิดปกติกับสระที่เข้ารหัสอย่างหนัก หากใบสมัครของคุณจะถูกใช้เพื่อนับเสียงสระเป็นภาษาอังกฤษเท่านั้น
Michael Paulukonis

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

1
@MichaelPaulukonis: และวางไว้ในฐานข้อมูลเป็นทางออกที่ปลอม การเปลี่ยนแปลงที่จำเป็นสำหรับชาวดัตช์? ศูนย์ (ไม่ใช่แม้แต่การเปลี่ยนแปลงฐานข้อมูล) ต้องการการเปลี่ยนแปลงสำหรับฝรั่งเศส / เยอรมันหรือไม่ อย่างน้อย ISO-8859-1 รองรับ (มากกว่า DB) การเปลี่ยนแปลงที่จำเป็นสำหรับกรีก / รัสเซีย รองรับ Unicode (มากกว่า DB) ในความเป็นจริงฉันไม่สามารถนึกถึงภาษาใด ๆ ที่ฐานข้อมูลนั้นมีความช่วยเหลือใด ๆ
MSalters

คำตอบ:


22

มีเหตุผลที่ดีหลายประการในการแยกข้อมูลจากรหัสและเหตุผลบางอย่างไม่ควรทำ ต่อไปนี้มาถึงใจ

ทันเวลา ค่าข้อมูลเป็นที่รู้จักกันเมื่อใด มันเป็นเวลาที่รหัสจะถูกเขียนเมื่อมันถูกรวบรวมเชื่อมโยงปล่อยได้รับใบอนุญาตกำหนดค่าเริ่มต้นการดำเนินการหรือในขณะที่ทำงาน ตัวอย่างเช่นทราบจำนวนวันในหนึ่งสัปดาห์ (7) แต่อัตราแลกเปลี่ยน USD / AUD จะเป็นที่ทราบกันช้า

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

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

แยกความกังวล การรับอัลกอริทึมในการทำงานอย่างถูกต้องจะแยกออกจากการพิจารณาว่าค่าข้อมูลใดที่จะใช้ จำเป็นต้องใช้ข้อมูลเพื่อทดสอบอัลกอริทึมไม่ใช่เพื่อเป็นส่วนหนึ่งของพวกเขา ดูเพิ่มเติมhttp://c2.com/cgi/wiki?ZeroOneInfinityRule

ในการตอบคำถามของคุณนี่ไม่ใช่สิ่งใหม่ หลักการสำคัญไม่เปลี่ยนแปลงในรอบกว่า 30 ปีและเขียนซ้ำ ๆ ในช่วงเวลานั้น ฉันจำได้ว่าไม่มีการตีพิมพ์ครั้งใหญ่ในหัวข้อเนื่องจากโดยทั่วไปแล้วจะไม่ถือว่าเป็นการโต้เถียง แต่เป็นสิ่งที่อธิบายให้กับผู้มาใหม่ มีบิตมากขึ้นที่นี่: http://c2.com/cgi/wiki?SeparationOfDataAndCode

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

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


2
คุณสามารถขยายประวัติศาสตร์และแนวโน้มของการฝึกฝนนี้ได้หรือไม่? หากทุกคนให้ข้อพิจารณาเหล่านี้ฉันจะไม่ถามคำถาม หลักฐานของคำถามคือผู้คนไม่ได้พิจารณาอย่างถี่ถ้วนว่าควรเก็บข้อมูลของพวกเขาไว้ที่ใด (ค่าคงที่ที่รวบรวม, ฐานข้อมูลภายนอก, YAML ... ) แต่พวกเขากำลังคิดเพียง "รหัสและข้อมูลที่ไม่ดีผสม! ทำไมหรือเมื่อใดจึงกลายเป็นสิ่ง?
Phil Frost

มันไม่ใช่ส่วนหนึ่งของประสบการณ์ของฉันดังนั้นฉันไม่สามารถบอกคุณได้ ฉันได้เพิ่มร่มอีกสองคู่ลงในคำตอบของฉัน
david.pfx

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

คุณจะได้รับ "_____ BAD! HULK SMASH!" เสมอ - นั่นไม่ได้หมายความว่าเป็นเรื่องจริง บ่อยครั้งที่สิ่งเช่นนี้ (เช่น "'GOTO' BAD! HULK SMASH!") ได้รับการสอนให้กับผู้เริ่มต้นโดยไม่ได้สอนว่าทำไมหรืออะไรคือข้อยกเว้น
AMADANON Inc.

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

8

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

สิทธิ์

หากข้อมูลมีการเข้ารหัสยากคุณจะต้องแก้ไขไฟล์ต้นฉบับเพื่อแก้ไขข้อมูลนั้น นั่นหมายความว่า:

  • นักพัฒนาเท่านั้นที่สามารถแก้ไขข้อมูล สิ่งนี้ไม่ดีการป้อนข้อมูลไม่ใช่สิ่งที่ต้องการทักษะและความรู้ของนักพัฒนา

  • ผู้พัฒนาที่ไม่ใช่นักพัฒนาสามารถแก้ไขไฟล์ต้นฉบับ สิ่งนี้ไม่ดี - พวกเขาอาจไขไฟล์ต้นฉบับโดยที่ไม่รู้ตัว

  • ข้อมูลถูกเข้ารหัสลงในไฟล์ต้นฉบับแยกต่างหากและผู้ที่ไม่ใช่นักพัฒนาสามารถเข้าถึงไฟล์เหล่านั้นได้เท่านั้น แต่นี่ไม่นับจริง - ตอนนี้ข้อมูลถูกแยกออกจากรหัสและเก็บไว้ในไฟล์ของตัวเอง ...

การตัดต่อ

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

หากข้อมูลมีการเข้ารหัสยากการสร้าง UI นั้นจะหมายความว่าเครื่องมืออัตโนมัติจะแก้ไขไฟล์ต้นฉบับที่คุณเขียนด้วยมือ ปล่อยให้มันจมลง - เครื่องมืออัตโนมัติจะเปิดไฟล์ต้นฉบับของคุณพยายามค้นหาว่าข้อมูลควรอยู่ที่ใดและแก้ไขโค้ดนั้น Brrr ... Microsoft แนะนำคลาสบางส่วนให้กับ C # เพื่อหลีกเลี่ยงสิ่งเหล่านั้น ...

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

การปรับขนาด

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

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

ค้นหา

คุณมีข้อมูลมากมาย - เป็นเรื่องธรรมดาที่คุณต้องการค้นหาผ่านมัน

  • หากคุณเก็บไว้ในฐานข้อมูล - คุณสามารถใช้ภาษาแบบสอบถามฐานข้อมูล

  • หากคุณเก็บไว้ในไฟล์ XML คุณสามารถใช้ XPath

  • หากคุณเก็บไว้ใน JSON / YAML - คุณสามารถโหลดใน REPL ภาษาสคริปต์ที่คุณชื่นชอบและค้นหา

  • แม้ว่าคุณจะเก็บมันไว้ในไฟล์ข้อความธรรมดาเก่า ๆ เพราะมันมีโครงสร้างที่โปรแกรมของคุณสามารถจดจำได้ว่าคุณสามารถใช้ grep / sed / awk เพื่อค้นหาได้

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

มีเครื่องมือสำหรับค้นหารหัส แต่เหมาะสำหรับการค้นหาการประกาศไม่ใช่ข้อมูลที่เข้ารหัสยาก

ที่ถูกกล่าวว่า ...

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

ฉันเรียนเมื่อเรามีกฎเกณฑ์ที่เข้มงวดมากเกี่ยวกับ "หมายเลขเวทมนตร์" - เราไม่มีตัวเลขใด ๆ ในรหัสของเรา นั่นหมายความว่าเราต้องทำสิ่งต่าง ๆ เช่น:

#define THE_NUMBER_ZERO 0
//....
for(int i=THE_NUMBER_ZERO;i<cout;++i){
//....

ซึ่งไร้สาระทันที! ใช่0เป็นเทคนิค "ข้อมูล" แต่มันก็เป็นส่วนหนึ่งของรหัสเป็นส่วนที่เหลือของforวง! ดังนั้นแม้ว่าเราจะสามารถแสดงเป็นข้อมูลและการแยกจากรหัสที่ไม่ได้หมายความว่าเราควร ไม่ใช่เพราะเราต้องการทิ้งข้อมูลไว้ในโค้ด แต่เป็นเพราะมันไม่ใช่ข้อมูล - ไม่ใช่มากกว่าส่วนที่เหลือของรหัสซึ่งถูกคอมไพล์ไปยังคนและศูนย์ ...


7

ฉันคิดว่ามีความสับสนเกิดขึ้น คุณกำลังผสมสองสิ่งเข้าด้วยกัน: "การแยกรหัสและข้อมูล" และ "แสดงพฤติกรรมของโปรแกรมเป็นข้อมูล"

ในกรณีของคุณคุณเป็นห่วงเรื่องที่สองและผสมตัวแรกเข้ากับมัน เมื่อคุณแสดงพฤติกรรมของโปรแกรมเป็นข้อมูลมันจะขยายได้ง่ายขึ้น ในตัวอย่างของคุณด้วยvowels = "aeiou"จากนั้นการเพิ่มสระใหม่นั้นง่ายพอ ๆ กับการเพิ่มตัวละคร หากคุณมีข้อมูลนี้จากภายนอกคุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยไม่ต้องคอมไพล์โปรแกรมใหม่

และเมื่อคุณคิดถึง OOP ก็เป็นส่วนเสริมของความคิดนี้ การผูกข้อมูลและพฤติกรรมเข้าด้วยกันจะช่วยให้คุณสามารถเปลี่ยนพฤติกรรมของโปรแกรมตามข้อมูลของโปรแกรม


2
ทำให้เกิดเป็นธรรมชาติรายชื่อของสระจะมีการเปลี่ยนแปลง
cHao

13
@cHao ทันทีที่ i18n เข้ามา
Reinstate Monica

2
i18n สามารถทำลายสมองของคุณ - ดูตัวอย่างที่ผิดปกติใน Java ในjavaspecialists.eu/archive/Issue209.html
Rory Hunter

2
@Angew: ทันทีที่ขั้นตอนใน i18n แม้ว่าคุณเมาแล้วล่ะค่ะ คุณต้องการรหัสสำหรับสิ่งนี้; โซลูชันไร้เดียงสาไม่สามารถจัดการได้ทุกกรณีแม้เป็นภาษาอังกฤษ (ลืมไปครู่ïหนึ่งลองพูดถึงyและw!) การย้ายรายการออกไปยังฐานข้อมูลจะไม่ช่วยแก้ปัญหานั้นและเป็นอันตรายจริง ๆ - มันซับซ้อนที่จะไม่มีค่าหากทำผิด แต่คุณจะไม่ทำ แม้จะรู้ว่า "ผิด" คืออะไรนอกจากว่าคุณกำลังออกแบบสำหรับ i18n จากพื้นดินขึ้นมา เมื่อถึงจุดที่คุณรู้อยู่แล้วว่ารายชื่อสระไม่สามารถตัดได้
cHao

1
@BenLee: ฉันจะไม่แปลกใจจริง ๆ ฉันกำลังทำงานเกี่ยวกับการเปลี่ยนรหัสบางอย่างเช่นที่เราพูด แต่การจ้างทุกอย่างไปยังฐานข้อมูลเป็นการทำนายโชคชะตาของประเภทอื่นทั้งหมด หากคุณยังไม่ทราบว่าจะต้องมีการแก้ไขอะไรบ้างและที่สำคัญกว่านั้นถ้าคุณยังไม่รู้ว่าจะต้องแก้ไขอย่างไร - IMO จะดีกว่าถ้าคุณต้องการความยืดหยุ่นก่อนที่จะเพิ่มเข้าไป .
cHao

5

ตัวอย่างเช่นหากฟังก์ชันของโปรแกรมของคุณคือการนับเสียงสระสิ่งที่ผิดปกติในการมีเสียงสระ = "aeiou" อยู่ในนั้น

การจัดเก็บการกำหนดค่าภายนอกช่วยให้คุณมีรหัสหนึ่งเวอร์ชันที่คาดว่าจะทำงานกับการกำหนดค่าได้หลายทางเลือกคือการบำรุงรักษาซอฟต์แวร์หลายเวอร์ชันที่แตกต่างกันตามการกำหนดค่าเท่านั้น

คุณพูดถึงสระ = "aeiou" แล้วถ้าฉันต้องการ "y" บางครั้งฉันต้องสร้างใหม่ทั้งโปรแกรม? ฉันสามารถอัพเกรดเวอร์ชั่นได้อย่างง่ายดายในขณะที่ฉันแก้ไขโค้ดหรือไม่ หากมีข้อผิดพลาดฉันเป็นสาเหตุหรือโปรแกรมเสียหายหรือไม่

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

เมื่อคุณแยกข้อมูลลงใน YAML หรือไฟล์ข้อความหรือฐานข้อมูลโง่ราวกับว่าคุณกำลังลบเนื้องอกออกจากรหัส

บางคนมองว่ามันตรงกันข้ามนั่นคือคุณกำลังลบรหัสของเนื้องอกออกจากข้อมูลอันมีค่าของคุณดู: คำพูดของ Torvalds เกี่ยวกับโปรแกรมเมอร์ที่ดี


4
คำพูดของ Torvalds อ้างถึงโครงสร้างข้อมูลไม่ใช่ข้อมูล
949300

สถานะ OP: "การเขียนโปรแกรมเชิงวัตถุกล่าวว่า" เราต้องการโครงสร้างข้อมูลที่หลากหลายตามอำเภอใจ "และมอบโครงสร้างข้อมูลด้วยพลังของรหัส"
FMJaguar

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

+1 สำหรับคำพูดของ Torvalds ฉันเห็นด้วยกับความรู้สึกนี้: ในตัวอย่างหุ่นกระบอกฉันคิดว่าปัญหาคือหุ่นเชิดนั้นไม่มีโครงสร้างข้อมูลที่ดีในการเป็นตัวแทนของข้อมูลที่ผู้คนต้องการจะใส่เข้าไป แทนที่จะแก้ไขโครงสร้างข้อมูลนักพัฒนาหุ่นเชิดอ้างว่า "data in code" เป็นปัญหา (เพราะเหตุใดคำถามนั่นคือคำถาม!) และพัฒนาhieraซึ่งฉันเห็นมากกว่าเคลื่อนย้ายปัญหาที่อื่นและทำให้เป็นไปไม่ได้ เพื่อเชื่อมโยงพฤติกรรมกับข้อมูล
Phil

2

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

ตอนนี้ฉันยังคงคิดว่าเป็นการตัดสินใจที่โง่และถ้าเราไม่มีโครงสร้างพื้นฐานในมือฉันก็จะไม่ทำ

แต่ข้อโต้แย้งบางอย่างที่ฉันเห็นก็คือ:

  • หากคุณมีความคิดฐานข้อมูลการใส่ข้อมูลอ้างอิงลงในฐานข้อมูล SQL จะช่วยให้คุณสามารถเข้าร่วมเพื่อรายงานได้
  • หากคุณมียูทิลิตีผู้ดูแลระบบหรือเข้าถึงฐานข้อมูลคุณสามารถปรับแต่งค่าที่รันไทม์ (แม้ว่าจะสามารถเล่นได้ด้วยไฟ)

นอกจากนี้บางครั้งนโยบายก็จะได้รับแนวทางการเข้ารหัส ตัวอย่างเช่นฉันเคยทำงานที่ร้านค้าหลายแห่งซึ่งการกดไฟล์. xml เป็น A-OK ในขณะที่การแตะบรรทัดในโค้ดต้องใช้วงจรการถดถอยเต็มรูปแบบและอาจเป็นการทดสอบโหลด ดังนั้นจึงมีทีมหนึ่งที่ฉันอยู่ในตำแหน่งที่ไฟล์. xml ของฉันสำหรับโปรเจ็กต์นั้นสมบูรณ์มาก (และอาจ - -heh- อาจมีรหัสบางส่วน)

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


3
ความคิดเห็นดีเกี่ยวกับขั้นตอนการซื้อสินค้าซึ่งการแก้ไข XML เป็น "ok" แต่การแก้ไขสิ่งเดียวกันในรหัสนั้นเป็นเรื่องที่ยุ่งยากมาก
user949300

ทำงานในร้านเดียวที่ทุกอย่างอยู่ในฐานข้อมูลที่สามารถลงไปถึงหน้าจอข้อความ นอกเหนือจากรหัสอินเทอร์เฟซผู้ใช้แล้วสิ่งเดียวที่ไม่ได้อยู่ในฐานข้อมูลคือที่ตั้งฐานข้อมูลและข้อมูลประจำตัว ...
jwenting

3
มันฟังดูโง่ ๆ อยู่เรื่อย ๆ จนกระทั่งวันหนึ่งมีคนถามว่า "เราจะกำหนดค่านี้ใหม่ให้กับผู้ใช้ X ที่เรียกร้องมัน" แล้วมันก็ดูไม่โง่เลย ลูกค้าประณาม :)
gbjbaanb

2
... และถ้าวันนั้นเป็น "ไม่เคย" นั่นเป็นเวลานานที่จะรู้สึกเซื่องซึม
Rob

2

ให้ฉันถามคำถามตอบโต้กับคุณอย่างจริงจัง: ในมุมมองของคุณอะไรคือความแตกต่างระหว่าง "data" และ "code"?

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

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

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

แม้คำจำกัดความนี้ซึ่งค่อนข้างคลุมเครือน้อยกว่าคำว่า "ข้อมูล" ก็มีปัญหาเล็กน้อย ตัวอย่างเช่นถ้าส่วนสำคัญของโปรแกรมแต่ละรายการเขียนด้วยภาษาต่างกัน ฉันได้ทำงานส่วนตัวในหลายโครงการซึ่งมีประมาณ 50% C # และ 50% JavaScript รหัส JavaScript คือ "data" หรือไม่? คนส่วนใหญ่จะบอกว่าไม่มี แล้ว HTML คืออะไร "data" คนส่วนใหญ่ยังคงบอกว่าไม่มี

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

ผมอาจจะเรียก CSS ชนิดของการกำหนดค่า แต่ความหมายในทางปฏิบัติมากขึ้นก็คือว่ามันเป็นเพียงรหัสในโดเมนภาษาเฉพาะ นั่นคือสิ่งที่ XML, YAML และ "ไฟล์ที่จัดรูปแบบ" ของคุณเป็นตัวแทน และเหตุผลที่เราใช้ภาษาเฉพาะโดเมนก็คือโดยทั่วไปแล้วมันมีความกระชับและแสดงออกในโดเมนเฉพาะมากกว่าการเข้ารหัสข้อมูลเดียวกันในภาษาโปรแกรมทั่วไปเช่น C หรือ C # หรือ Java

คุณรู้จักรูปแบบต่อไปนี้หรือไม่?

{
    name: 'Jane Doe',
    age: 27,
    interests: ['cats', 'shoes']
}

ฉันแน่ใจว่าคนส่วนใหญ่ทำ; มันJSON และนี่คือสิ่งที่น่าสนใจเกี่ยวกับ JSON: ใน JavaScript มันเป็นรหัสที่ชัดเจนและในทุก ๆ ภาษามันเป็นข้อมูลที่จัดรูปแบบอย่างชัดเจน เกือบทุกภาษาการเขียนโปรแกรมหลักเดียวมีอย่างน้อยหนึ่งไลบรารีสำหรับ "การแยกวิเคราะห์" JSON

หากเราใช้ไวยากรณ์เดียวกันนั้นภายในฟังก์ชั่นในไฟล์ JavaScript มันก็ไม่สามารถเป็นอย่างอื่นได้นอกจากรหัส และถ้าเราใช้ JSON นั้นจงผลักมันเป็น.jsonไฟล์และแยกมันในแอปพลิเคชัน Java ทันใดนั้นมันก็คือ "ข้อมูล" มันสมเหตุสมผลจริงๆเหรอ?

ฉันยืนยันว่า "data-ness" หรือ "configuration-ness" หรือ "code-ness" นั้นมีอยู่ในตัวของสิ่งที่ถูกอธิบายไม่ใช่วิธีอธิบาย

หากโปรแกรมของคุณต้องการพจนานุกรม 1 ล้านคำเพื่อที่จะสร้างวลีรหัสผ่านแบบสุ่มคุณต้องการให้รหัสเช่นนี้หรือไม่:

var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");

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

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

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

สิ่งที่ฉันบอกให้กับผู้พัฒนาระบบรองคือพวกเขาควรปรับการตั้งค่าภายนอกที่พวกเขาคาดว่าจะเปลี่ยนแปลงตามสภาพแวดล้อม ซึ่งรวมถึงสิ่งต่าง ๆ เช่นสตริงการเชื่อมต่อชื่อผู้ใช้คีย์ API เส้นทางไดเรกทอรีและอื่น ๆ พวกเขาอาจจะเหมือนกันในกล่อง dev ของคุณและในการผลิต แต่อาจจะไม่และ sysadmins จะตัดสินใจว่าพวกเขาต้องการให้มันดูในการผลิตไม่ใช่ devs ดังนั้นคุณต้องมีวิธีหนึ่งในการตั้งค่ากลุ่มหนึ่งที่ใช้กับเครื่องบางเครื่องและการตั้งค่าอื่น ๆ ที่ใช้กับเครื่องอื่น ๆ - เพราะฉะนั้น, ไฟล์กำหนดค่าภายนอก (หรือการตั้งค่าในฐานข้อมูล ฯลฯ )

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

ดังนั้นเพื่อสรุป:

  • "รหัส" ไม่ใช่คำที่กำหนดอย่างเข้มงวด หากคุณขยายคำจำกัดความของคุณให้ครอบคลุมภาษาเฉพาะโดเมนและสิ่งอื่นที่มีผลต่อพฤติกรรมความเสียดทานที่เห็นได้ชัดนี้จะหายไปและมันก็สมเหตุสมผล คุณสามารถมี "รหัส" DSL ที่ไม่ได้คอมไพล์ในไฟล์แฟล็ต

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

  • "Soft-coding" อาจเป็นวิธีปฏิบัติที่เลวร้ายเมื่อนำไปใช้มากเกินไป แต่ไม่ใช่ทุกกรณีของการทำ externalization ที่จำเป็นต้องใช้ soft-coding และหลาย ๆ กรณีของการจัดเก็บข้อมูลใน

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


1

ฉันขอแนะนำให้อ่านบทความคลาสสิกนี้โดย Oren Eini (หรือที่รู้จักว่า Ayende Rahien)

http://ayende.com/blog/3545/enabling-change-by-hard-coding-everything-the-smart-way

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

วิธีนี้คุณอาจหลีกเลี่ยงความซับซ้อนของการแยกวิเคราะห์ / ตีความ ("แต่คนอื่นวิเคราะห์ YAML / JSON ของฉัน" - การแมปข้อความแยกวิเคราะห์เป็นการเรียก API ที่เฉพาะเจาะจงอาจเป็นรูปแบบของการตีความ) และหลีกเลี่ยงความซับซ้อนของขั้นตอนอื่นระหว่างข้อมูล "และการใช้งาน

บางกรณีทำตัวให้แสดงออกในข้อมูลแม้ในสถานการณ์เช่นนี้: ตัวอย่างเช่นการระบุจุดหลายพันจุดในพื้นที่ 3 มิติอาจเหมาะสำหรับไฟล์ข้อความมากกว่ารหัสแม้ว่าในบางภาษารวมถึง C ที่ใช้ initial initial struct สามารถมีความเหมาะสมแม้สำหรับที่


1

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

ให้ฉันหยุดคุณเขียนเครื่องมือนับจดหมายของคุณโดย (สูงกว่า) โดยใช้หลักการออกแบบง่าย ๆ เพียงอย่างเดียว: เมื่อคุณเขียนโค้ดที่ทำงานบางอย่างกับข้อมูลอินพุตของบางประเภทตรวจสอบให้แน่ใจว่าสามารถทำงานนั้นสำหรับอินพุตใดก็ตาม ข้อมูลประเภทนั้น - เมื่อคุณต้องการที่จะเขียนเครื่องมือ countig ตัวอักษรมันชัดเจนทำให้รู้สึกในการเขียนในทางดังนั้นมันจะไม่เพียง แต่สามารถนับสระ แต่ "ตัวอักษรใด ๆ " - เนื่องจากคุณอาจไม่รู้ว่าคลังข้อมูลที่คุณแยกวิเคราะห์คืออะไรจริง ๆ คุณอาจเลือกการเข้ารหัสทั่วไป (UTF-16) และครอบคลุมภาษาเขียนและสัญลักษณ์ส่วนใหญ่ (ทั้งหมด?)

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

ป้อนอสูรที่ป่าวประกาศ "การวางนัยทั่วไปและการใช้ซ้ำได้" -dogma: - ทำไมไม่นับสัญลักษณ์ใด ๆ ของคลาสใด ๆ ในอินพุตสตรีมของคลาสนั้น? (นามธรรมจากตัวอักษรไปยังลำดับบิตของความยาวตามอำเภอใจ แต่ จำกัด เนื่องจากเป็นเรื่องทั่วไปที่สุดที่คุณสามารถหาได้ด้วยคอมพิวเตอร์ ... ) - เดี๋ยวก่อนแม้ว่าเราจะยังนับตัวเลขตามธรรมชาติอยู่ อย่างไรก็ตามการนับสามารถวางเป็นรูปแผนที่จากชุดนับได้เพื่อตอบสนองความจริง ... [คุณได้ความคิด]

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

การแยก "data" และ "code" อาจจะเป็นเรื่องไม่สำคัญ (อาร์กิวเมนต์ของฟังก์ชัน) หรือคุณจะพบว่าตัวเองปฏิบัติกับค่าคงที่เป็นตัวแปร ("data")

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

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

สิ่งใดที่ไม่ชัดเจนที่นี่อาจเป็นกรณีของ "theor-deadlock": เช่นเดียวกับการเขียนอินเทอร์เฟซที่อ้างถึงอินเทอร์เฟซและอินเตอร์เฟซอื่น ... และในตอนท้ายคุณมีไฟล์ xml เล็กน้อยที่เรียบร้อย และการพึ่งพาที่จะถูกฉีดเข้าไปใน class-interface-clutter

หวังว่า xml-parser ที่คุณต้องการนั้นไม่จำเป็นต้องมี xml-config เพื่อที่จะทำงาน ...

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