มีข้อได้เปรียบในการเข้ารหัสค่าข้อมูลในโปรแกรมหรือไม่?


13

ฉันเป็น coder สามเณร - ish ที่เรียนรู้ด้วยตนเองดังนั้นฉันต้องขออภัยถ้าฉันไม่ตอกโปรแกรมภาษา

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

ดูเหมือนว่าทุกคนที่เกี่ยวข้องคิดว่าพวกเขาต้องการค่าข้อมูลรหัสฮาร์ดโค้ด (ไม่ใช่สกีมา แต่เป็นโดเมน / ค่าตัวเอง) ในโปรแกรมสร้างรายงาน

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

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

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



รายงานข้ามแท็บหมายถึงค่าในแถวควรปรากฏเป็นคอลัมน์หรือไม่
Tulains Córdova

1
@Brendan - หากคุณใช้รหัสฮาร์โค้ดในรายงานคุณจะต้องเปลี่ยนรายการในสถานที่สองแห่ง (แหล่งข้อมูลและรายงาน) ในขณะที่ถ้ารายงานเป็นแบบไดนามิกคุณจะต้องเปลี่ยนในที่เดียว (รายงาน) .
kwah

1
@Brendan ทำไมคุณถึงลงเอยด้วยสามสถานที่ บางทีความเข้าใจของฉันไม่ถูกต้อง แต่ฉันนึกภาพแบบสอบถาม sql เพื่อดึงข้อมูลจากฐานข้อมูลแอปพลิเคชันจะรวม / จัดกลุ่มค่าที่ส่งคืนโดยเช่นแผนก หากคุณยินดีที่จะมีค่าใช้จ่ายของแบบสอบถามหลาย db คุณสามารถเลือกแผนก / บทบาทที่แตกต่างหากคุณต้องการ ไม่มีข้อมูลอยู่ในสถานที่มากกว่าหนึ่งแห่ง - รายงานกำลังถูกขับเคลื่อนโดยข้อมูล
kwah

1
@Brendan ฉันยังไม่เห็นด้วยกับนิยามของคุณที่อยู่ในที่เดียว - วิธีที่คุณอธิบายว่ามันอยู่ในหลาย ๆ ที่กระจัดกระจายไปทั่วซอร์สโค้ด
kwah

คำตอบ:


9

วิกิพีเดีย:

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

การเข้ารหัสแบบแข็งนั้นถือเป็นปฏิปักษ์

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

บางครั้งคุณไม่สามารถหลีกเลี่ยงได้ แต่ควรเป็นการชั่วคราว

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

  • การเข้ารหัสข้อความยากที่จะทำให้โปรแกรมเป็นสากล
  • เส้นทาง Hardcoding ทำให้ยากต่อการปรับตัวเข้ากับสถานที่อื่น

ข้อได้เปรียบเพียงอย่างเดียวของการเข้ารหัส hardcoding ดูเหมือนจะเป็นการส่งรหัสที่รวดเร็ว


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

-1 ฉันไม่คิดว่านี่เป็นคำตอบที่เป็นประโยชน์ โดยพื้นฐานแล้วมันบอกว่า 'การฝังค่าลงในซอร์สโค้ดไม่เหมาะสม' นั้นไม่เหมาะสม ฉันคิดว่า OP ต้องการคำแนะนำว่าเมื่อใดที่สิ่งต่าง ๆ อาจอยู่ในซอร์สโค้ดดังนั้นจึงอยู่นอกเหนือคำจำกัดความของ Wikipedia ของคุณ
นาธานคูเปอร์

ฮาร์ดโค้ดควรเป็นส่วนสำคัญในกระบวนการของคุณและพิจารณาว่ารูปแบบการต่อต้านนั้นล้าสมัยไปแล้วในยุคของบริการไมโครโดยที่การสอน Angular Tour of Heroes เป็นตัวอย่างที่ดีของบ้านซอฟต์แวร์ขนาดใหญ่ที่เข้ารหัสโดยตรงหรือแม้แต่บังคับให้เป็น ขั้นตอนกลาง ยิ่งไปกว่านั้นเมื่อคุณย้ายไปยังข้อมูลแบบไดนามิกคุณควรยังคงเก็บข้อมูลที่เข้ารหัสไว้อย่างหนักเป็นแบบถอยกลับบางทีอาจถูกควบคุมโดยตัวแปรสภาพแวดล้อมหรือแม้แต่การบูลีนสลับกับโค้ดเองดังนั้นข้อผิดพลาดและปัญหาด้านความปลอดภัย ไลน์.
มีอะไรในการค้นหาของ Google

24

จริงๆ? ไม่มีกรณีการใช้ที่เป็นไปได้ที่ถูกต้อง?

ในขณะที่ฉันยอมรับว่าการเข้ารหัสแบบแข็งมักเป็นรูปแบบการต่อต้านหรืออย่างน้อยกลิ่นรหัสที่แย่มากแต่ก็มีหลายกรณีที่เหมาะสม:

  • ความเรียบง่าย ( YAGNI )
  • การป้อนข้อมูลเป็นค่าคงที่และจะไม่เปลี่ยนแปลง (กล่าวคือมันเป็นค่าคงที่ตามธรรมชาติหรือธุรกิจหรือการประมาณค่าหนึ่งเช่น 0, PI, ... )
  • ซอฟต์แวร์ฝังตัว (ข้อ จำกัด ของหน่วยความจำและการจัดสรรเป็นสิ่งสำคัญ)
  • ซอฟต์แวร์ที่ปลอดภัย (ค่าเหล่านี้ไม่สามารถใช้งานได้และ / หรือง่ายต่อการถอดรหัสหรือวิศวกรรมย้อนกลับเช่นโทเค็นการเข้ารหัสและเกลือ)
  • รหัสที่สร้างขึ้น (ตัวประมวลผลล่วงหน้าหรือตัวสร้างของคุณสามารถกำหนดค่าได้ แต่แยกรหัสด้วยค่าฮาร์ดโค้ด)
  • และอาจอีกไม่กี่

ยังต่อต้านรูปแบบ ? ดังนั้นวิศวกรรมมากเกินไป ! มันเกี่ยวกับอายุขัยซอฟต์แวร์ของคุณ !!

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

และอย่าควบคุมคนแรกเกี่ยวกับความเรียบง่าย / YAGNIโดยคิดว่ามันสำคัญ: อาจไม่มีเหตุผลที่จะใช้ parser บ้าและตัวตรวจสอบค่าสำหรับสคริปต์ง่าย ๆ ที่ทำงานหนึ่งเดียวสำหรับกรณีการใช้งานที่แคบมาก

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

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


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

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

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

1
@Tom อย่าขายตัวเองสั้นเกินไป คุณกำลังจะทำอะไรบางอย่าง Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']มันฟังดูง่ายและใช้เวลาน้อยมากในการเขียนขั้นตอนวิธีที่รวดเร็วในการจัดระเบียบข้อมูลโดยดูที่กรมและตำแหน่งงานสาขาเมื่อเทียบกับการเข้ารหัสยาก มันจะยากกว่ามากในการรักษาอาเรย์ฮาร์ดโค้ดในกรณีที่มีการเปิดตัวแผนกหรือชื่อเรื่องใหม่
Chris G

1
คุณสามารถมีสิ่งที่ซับซ้อนมากขึ้นซึ่งยังคงเหมาะสมที่จะ hardcode สิ่งหนึ่งที่อยู่ในใจว่าฉันเขียนเมื่อไม่กี่ปีที่ผ่านมาก็คือการเรียงสับเปลี่ยนค่าที่เป็นไปได้ ฉันจำเป็นต้องค้นหาทิศทางที่ถูกต้องแบบสุ่มเลือกการเรียงสับเปลี่ยนแบบสุ่มจากนั้นการรับผลลัพธ์ที่ถูกต้องครั้งแรกนั้นเป็นวิธีที่มีประสิทธิภาพที่สุดและเนื่องจากอยู่ในประสิทธิภาพของลูป O (N ^ 3)
Loren Pechtel

4

มีบางครั้งมันก็โอเคกับรหัสยาก ตัวอย่างเช่นมีบางตัวเลขเช่น 0 หรือหนึ่งหรือหลายค่า n ^ 2-1 สำหรับ bitmasks ที่จำเป็นต้องมีค่าบางอย่างเพื่อวัตถุประสงค์อัลกอริทึม การอนุญาตให้ใช้ค่าที่กำหนดได้นั้นไม่มีค่าและจะเปิดโอกาสในการเกิดปัญหาเท่านั้น กล่าวอีกนัยหนึ่งถ้าเปลี่ยนค่าจะทำลายสิ่งต่าง ๆ เท่านั้นมันอาจจะเป็น hardcoded

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


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

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

-1

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

การเข้ารหัสแบบ Hard-crypt ช่วยหลีกเลี่ยงความเสี่ยงเหล่านี้

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

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