เราสามารถเพิ่มการไหลของข้อมูลระหว่างส่วนต่าง ๆ ของรหัสฐานขนาดใหญ่ได้ง่ายขึ้นหรือไม่


10

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

ข้อความอ้างอิงจาก Yossi Kreinin บล็อกโพสต์ที่http://www.yosefk.com/blog/i-want-a-struct-linker.html :

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

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

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


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

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

ฉันเดาว่าสิ่งที่อาจช่วยได้คือการสร้างแบบจำลองการไหลของข้อมูลอย่างชัดเจนและแยกส่วนประกอบจากการไหลของข้อมูล วิศวกรซอฟต์แวร์ชาวเยอรมันเขียนเกี่ยวกับหัวข้อนี้มากบทความส่วนใหญ่เป็นภาษาเยอรมัน นี่คือรายการบทความเป็นภาษาอังกฤษของเขา: geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/…
Doc Brown

ฉันคิดว่า API ภายในแบบซิงเกิลสามารถช่วยได้ มันจะสามารถเข้าถึงได้ทั่วแอปพลิเคชันและจะแค็ปซูลลอจิกการดึงข้อมูลทั้งหมด
superM

คำตอบ:


1

คุณกำลังอ้างถึง CDI (การฉีดขึ้นกับบริบท) AKA IoC (การกลับตัวควบคุม) Java JSF และ Spring Framework เป็นตัวอย่างบางส่วน ASP.NET MVC มีปลั๊กอินเหมือน Unity Javascript เริ่มมีโครงสร้างที่จัดระเบียบโดยใช้ไลบรารีเช่น RequireJS ซึ่งมีพฤติกรรมการฉีดที่เห็นได้ในเฟรมเวิร์ก JS สมัยใหม่จำนวนมาก นั่นคือการเดินสายแอปพลิเคชันในพื้นที่และระยะไกล

สำหรับการเชื่อมต่อแบบหลวม ๆ ในเครือข่าย บริษัท ต่างๆต้องการใช้บริการเว็บด้วย SOAP, REST, AJAX หรือวิธีการโทรระยะไกลปกติด้วย RPC ใน Java คุณสามารถใช้ JAX-WS หรือ. NET WCF เพื่อสร้างบริการแบบกระจาย จากนั้นคุณจัดเรียงพวกเขาใน Service บัสหรือ "data flow" จากภาษาหรือแพลตฟอร์มใด ๆ ในฐานะลูกค้า Ruby, Python, Scala, Java, C #, ... อะไรก็ได้

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

หากโครงการของคุณยืนยันในเครือข่ายไม่มีมีภาษาเช่น Scala, Akka, NodeJS ฯลฯ ที่ออกแบบมาสำหรับการไหลของข้อมูลที่สูงภายในโปรแกรมเดียว พวกเขายังทำงานร่วมกับเทคโนโลยีที่กล่าวถึงก่อนหน้านี้บางส่วนหรือทั้งหมดสำหรับโครงการที่ซับซ้อน ตัวอย่างเช่น Scala สามารถใช้กับบริการ JAX-RS REST สำหรับดึงประเภท "ข้อมูลทั่วโลก" จากแหล่งข้อมูลและมี Spring สำหรับการเดินสายภายใน IoC นอกจากนี้ยังมีเฟรมเวิร์กการดำเนินธุรกิจหรือเวิร์กโฟลว์จำนวนมากในเครื่องมือ JBoss, .NET และ GUI เช่น MuleESB ในการพัฒนา Eclipse และ Netbeans ช่วยให้คุณสามารถลากและวางบริการในหน้าจอแผนภูมิการไหลของภาพ

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

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


Message Queues อาจ overkill แต่การรับส่งข้อความเป็นวิธีที่สมบูรณ์แบบในการทำให้เหตุการณ์โดนทั่วกระดาน Java ใช้ Message Driven Beans (MDB) และควรอนุญาตให้โปรแกรมของคุณส่งหรือรับ 'การสนทนา' ซึ่งกันและกัน คุณสามารถทำเช่นนี้เพื่อรับโบนัสอะซิงโครนัส
Senor Developer

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

0

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

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

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


ขอบคุณสำหรับคำตอบ! สำหรับฉันแล้วดูเหมือนว่าการวิจัยภาษาการเขียนโปรแกรมสามารถช่วยแก้ไขปัญหานี้ได้ ตัวอย่างเช่นหากรหัสอ่านข้อมูลบางส่วนจากฐานข้อมูลส่วนกลางหรือจากการเก็บข้อมูลเดี่ยวอาจมีการรับประกันแบบคงที่ / ประกาศเกี่ยวกับข้อมูลที่ต้องการ
Vladimir Slepnev

-1

ถ้าคุณใช้ (หรือพูด) คำ

hairy flow of control

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


ทำไมต้องลงคะแนน? ข้อความอ้างอิงหายไปจากบทนำที่สนับสนุนมุมมองของฉัน: "(อาจจัดเป็น" Antipattern "หรือ" Code Smell "และมีชื่ออยู่ในแวดวงที่เหมาะสม แต่ฉันไม่รู้ ปล่อยให้มันไม่มีชื่อ) "
user127749

2
นี่ไม่ใช่คำตอบสำหรับคำถามนี่อาจเป็นเหตุผลของการ
โหวต

ถ้าอย่างนั้นฉันจะใช้ถ้อยคำใหม่: มีเคล็ดลับเวทมนต์เพื่อยกเลิกระเบียบของรหัสที่ละเมิดหนึ่งในหลักการพื้นฐานที่สุดของการออกแบบซอฟต์แวร์: KISS (ทำให้มันง่ายโง่)? เคล็ดลับไม่ใช่เวทมนตร์มันเป็นทั้งโปรแกรมเมอร์ที่ไม่สามารถแทนที่ได้เพราะเขารู้รายละเอียดที่ไม่ชัดเจน (ซึ่งจะฆ่า บริษัท ในระยะยาว) หรือเพื่อปรับโครงสร้างฐานรหัส น่าเสียดายที่หลาย บริษัท เริ่มแรกไม่สนใจการออกแบบรหัสที่เหมาะสมหรือไม่เข้าใจผลที่ตามมาจากนั้นต้องเขียนรหัสใหม่อย่างน้อยหนึ่งครั้งหลาย ๆ คนถึงกับเขียนซ้ำหลายครั้ง ...
user127749
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.