หนึ่งควรจัดการค่าคงที่ในหลายภาษาได้อย่างไร?


13

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

วิธีที่ฉันทำอยู่ในขณะนี้คือการให้รหัสกำหนดค่าคงที่ในแต่ละภาษา

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

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

มีวิธีที่ดีกว่าในการจัดการค่าคงที่ซึ่งใช้ร่วมกันระหว่างหลายภาษาหรือไม่


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

5
@DavidPacker ไม่ไม่ไม่คุณควรจะมีทางออกที่หรูหราจริงๆสำหรับฉัน อย่าบอกฉันว่านี่คือสิ่งที่ดีที่สุด! :-)
enderland

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

คุณต้องใช้ตารางที่แมปกับค่าคงที่จากตารางภาษา
johnny

คำตอบ:


10

แม้ว่าฉันคิดว่าวิธีการในปัจจุบันของคุณน่าจะง่ายและตรงไปตรงมาที่สุด

  • แยกค่าคงที่ของคุณ (และบางทีแบบจำลอง) ไปยังแพ็คเกจอื่นที่ถูกคอมไพล์ข้ามกับภาษาทั้งหมดของคุณ คุณอาจรวบรวมไลบรารีทั้งหมด แต่อาจมีปัญหาจำนวนมาก แค่ค่าคงที่การคอมไพล์ข้ามควรง่ายพอที่จะไม่มีปัญหามาก คุณสามารถเผยแพร่แพ็คเกจค่าคงที่ของคุณและขึ้นอยู่กับมันในไลบรารีเฉพาะภาษาของคุณ Haxeอาจทำเช่นนั้นได้ วิธีนี้เป็นวิธีที่ดีเพราะคุณจะยังคงมีการตรวจสอบเวลาคอมไพล์ (สำหรับภาษาที่คอมไพล์แล้ว)
  • จัดเก็บการกำหนดค่าในบริการส่วนกลาง ตัวอย่างเช่นเว็บเซอร์วิสสบู่มีคำอธิบายบริการเว็บภาษา (WSDL) และบริการ REST มีเว็บแอพพลิเคชันคำอธิบายภาษา (WADL) ซึ่งอธิบายการดำเนินการและข้อความของบริการ นอกจากนี้ยังมีบริการกำหนดค่าส่วนกลางส่วนกลางเช่นSpring Cloud Config
  • ไฟล์กำหนดค่า ฉันรู้ว่าคุณได้แนะนำแล้ว แต่ฉันไม่คิดว่ามันจะทำให้กระบวนการสร้าง / วางจำหน่ายของคุณซับซ้อนขึ้นมากนัก วางไฟล์ปรับแต่งของคุณในโครงการบิลด์แยกต่างหาก (ซึ่งคุณสามารถเวอร์ชั่นได้) เผยแพร่โครงการไปยังคลังเก็บแพคเกจเฉพาะภาษาทั้งหมดของคุณ (Maven, Nuget, NPM, ฯลฯ ) จากนั้นในไลบรารีเฉพาะภาษาของคุณคุณสามารถขึ้นอยู่กับแพ็คเกจ สิ่งนี้ไม่ควรซับซ้อนกว่าการมีโครงการเพิ่มเติมในไปป์ไลน์ของคุณ
  • ตามที่ RubberDuck แนะนำการสร้างรหัสเป็นทางเลือกที่ดีในการคอมไพล์ข้าม คุณสามารถสร้างคำจำกัดความคงที่สำหรับแต่ละภาษาโดยใช้การกำหนดค่าทั่วไป

5
การสร้างรหัส @RubberDuck ฟังดูน่าสนใจ (โดยเฉพาะอย่างยิ่งสำหรับกรณีการใช้วงสัมผัสของฉันซึ่งเกี่ยวข้องกับตัวสร้างโค้ดอยู่แล้ว)
enderland

3

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

น่าเสียดายที่สิ่งที่ดีที่สุดที่ฉันได้พบ (คือคุณ) คือการกำหนดค่าคงที่ใหม่สำหรับแต่ละภาษาอย่างที่คุณกำลังทำอยู่ (ฉันรู้ว่าคุณต้องการได้ยินอย่างนั้น )

เห็นได้ชัดว่ามันผิดเพราะมันตรงกันข้ามกับ DRY ( WET ?? ) อย่างไรก็ตามค่าคงที่ควรเปลี่ยนบ่อยครั้งที่การกำหนดใหม่ 5-10 นาทีสำหรับแต่ละภาษานั้นไม่ได้รบกวนฉันจริงๆ ในตอนท้ายของวันปัญหาเล็ก ๆ ที่มีโซลูชัน 'หรูหรา' บางอย่างเช่นการกำหนดค่าที่ใช้ร่วมกันหรือการสร้างรหัสอาจใช้เวลาหลายชั่วโมงหรือหลายวันในการแก้ไขดังนั้นสิ่งที่ได้รับจริง ๆ เพิ่มความซับซ้อนด้วยความเสี่ยงของสิ่งที่ผิดพลาดซึ่งอาจใช้ความพยายามแก้ไขเพิ่มเติมไม่ใช่สิ่งที่ฉันต้องการจัดการ

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

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

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


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


0

หวังว่าไลบรารี่ของคุณจะถูกเขียนเป็นภาษาเดียวและไลบรารี่อื่น ๆ ก็ใช้ FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ) เพื่อโทรไปยังไลบรารีหลัก สิ่งนี้จะให้ตำแหน่งศูนย์กลางแก่คุณเพื่อให้ API เพื่อเผยแพร่ค่าคงที่และคำจำกัดความจาก วิธีนี้ทุกอย่างมีอยู่ภายในห้องสมุด ฉันแค่พูดถึงเรื่องนี้เพราะมันดูเหมือนจะไม่รวมอยู่ในคำตอบของซามูเอล

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


1
Hopefully, the core of you library is written in one language, and the other libraries use FFI น่าเสียดายที่เรามีห้องสมุดสำหรับทั้งเว็บไคลเอ็นต์และรหัสเซิร์ฟเวอร์ (ในหลายภาษา) ดังนั้น ... การดึงออกไม่น่าสนใจ (และอาจเป็นจุดอ่อนด้านความปลอดภัยหากเราอาจเริ่มต้นด้วยแอปพลิเคชันเว็บ)
enderland

ฉันขอแนะนำให้คุณปรับปรุงความปลอดภัยของคุณเพราะฉันจะไม่เชื่อใจผู้ใช้ของฉันมากพอที่จะเก็บไฟล์การกำหนดค่าเป็นความลับ
Robert Baron

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

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

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