วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

3
โอเพ่นซอร์สลิขสิทธิ์และการแก้ไขข้อผิดพลาดเล็กน้อย
สมมติว่านักพัฒนาซอฟต์แวร์ได้พัฒนาห้องสมุดสำหรับแอปพลิเคชั่นเชิงพาณิชย์ที่ให้แหล่งข้อมูลปิด เนื่องจากพวกเขาต้องการคืนกลับสู่ชุมชนโอเพนซอร์สพวกเขาเผยแพร่ไลบรารีนี้ภายใต้พูด GPL แต่ใช้งานต่อไปในแอปพลิเคชันของตนเอง เนื่องจากพวกเขาถือลิขสิทธิ์นั่นเป็นเรื่องปกติ ขณะนี้ผู้ใช้เวอร์ชัน GPL พบข้อบกพร่องแก้ไขและส่งแพตช์ไปยังผู้พัฒนาดั้งเดิม ดังที่ฉันเข้าใจเพื่อใช้บั๊กนี้ในแอปพลิเคชันแบบโอเพ่นซอร์สผู้พัฒนาจำเป็นต้องได้รับอนุญาตจากผู้ส่ง หากผู้ส่งปฏิเสธนักพัฒนาจะต้องหาวิธีอื่นในการแก้ไขข้อบกพร่องในรุ่นที่มาปิด แต่จะเกิดอะไรขึ้นถ้าตัวแก้ไขข้อผิดพลาดนั้นเล็กน้อย? ชอบเริ่มต้นตัวแปรอย่างถูกต้องหรือตรวจสอบตัวชี้โมฆะหรือไม่ สิ่งที่โปรแกรมเมอร์ที่มีความสามารถครึ่งหนึ่งสามารถค้นหาและแก้ไขได้ภายในไม่กี่นาทีโดยมีคำอธิบายข้อผิดพลาดหรือไม่ แพทช์นี้ยังคงได้รับการคุ้มครองตามกฎหมายลิขสิทธิ์หรือไม่? หรือผู้พัฒนาดั้งเดิมสามารถใช้การแก้ไขที่เหมือนกันในแอปพลิเคชันแบบปิดของพวกเขาโดยไม่ได้รับความยินยอมจากผู้ส่งหรือไม่? หมายเหตุ: นี่เป็นสถานการณ์สมมติไม่ใช่คำถาม "เพื่อน" ของฉันมีปัญหานี้ "

4
ในการทดสอบหน่วยเหตุใดฉันจะสร้างที่เก็บสองครั้ง
เมื่อวันก่อนฉันอ่านเกี่ยวกับการทดสอบหน่วยเล็กน้อยและฉันเห็นตัวอย่างที่ผู้คนสร้างส่วนต่อประสานที่เก็บ (เช่นIExampleRepository) จากนั้นสร้างที่เก็บจริง ( public class ExampleRepository : IExampleRepository) และที่เก็บที่จะใช้สำหรับการทดสอบหน่วย ( FakeExampleRepository : IExampleRepository) ในIExampleRepositoryพวกเขาใช้วิธีการเดียวกันกับในExampleRepositoryแต่ด้วยคำสั่ง Linq ที่แตกต่างกัน อะไรคือวัตถุประสงค์ตรงนี้? ฉันคิดว่าส่วนหนึ่งของการทดสอบหน่วยของคุณคือตรวจสอบให้แน่ใจว่าวิธีการทำงานถูกต้องหรือไม่ แต่เมื่อฉันใช้แบบสอบถามที่แตกต่างกันสองข้อคำถามหนึ่งสำหรับ 'จริง' และอีกคำถามหนึ่งในการทดสอบการทดสอบมีความรู้สึกมากเพียงใด

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

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

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

3
วิธีใช้การประเมินผลขี้เกียจของ if ()
ขณะนี้ฉันกำลังใช้ตัวประเมินผลนิพจน์ (นิพจน์บรรทัดเดียว, เช่นสูตร) ​​ตามสิ่งต่อไปนี้: การแสดงออกที่ป้อนถูกโทเค็นเพื่อแยก booleans ตัวอักษรจำนวนเต็มทศนิยมสตริงฟังก์ชั่นตัวระบุ (ตัวแปร) ฉันใช้อัลกอริทึม Shunting-yard (แก้ไขเบา ๆ เพื่อจัดการฟังก์ชันที่มีจำนวนตัวแปรที่มีข้อโต้แย้ง) เพื่อกำจัดวงเล็บและสั่งให้ผู้ประกอบการที่มีความสำคัญมาก่อนในลำดับ postfixed shunting-yard ของฉันสร้างคิวโทเค็น (จำลอง) (โดยใช้อาร์เรย์อาร์เรย์ภาษา Powerbuilder Classic ของฉันสามารถกำหนดวัตถุ แต่มีอาร์เรย์แบบไดนามิกเป็นหน่วยเก็บข้อมูลดั้งเดิมไม่ใช่รายการจริงไม่มีพจนานุกรม) ที่ฉันประเมินตามลำดับด้วย เครื่องกองง่าย ผู้ประเมินของฉันทำงานได้ดี แต่ฉันก็ยังขาดif()และฉันก็สงสัยว่าจะดำเนินการต่อไปอย่างไร ถ้าฉันเพิ่มif()ฟังก์ชันอื่นที่มีส่วนที่เป็นจริงและเท็จอยู่คนเดียวif(true, msgbox("ok"), msgbox("not ok"))จะแสดงข้อความทั้งสองในขณะที่ฉันต้องการจะแสดงเพียงข้อความเดียว นี่เป็นเพราะเมื่อฉันต้องการประเมินฟังก์ชั่นข้อโต้แย้งทั้งหมดได้รับการประเมินและวางลงบนสแต็ก คุณช่วยให้ฉันใช้if()วิธีขี้เกียจบางอย่าง? ฉันคิดว่าการประมวลผลเหล่านี้เป็นมาโครชนิดหนึ่ง แต่ในตอนแรกฉันยังไม่ได้ประเมินสภาพ บางทีฉันอาจต้องใช้โครงสร้างชนิดอื่นที่ไม่ใช่คิวเพื่อแยกเงื่อนไขและนิพจน์จริง / เท็จออกจากกัน? สำหรับตอนนี้นิพจน์จะถูกวิเคราะห์ก่อนการประเมินผล แต่ฉันยังวางแผนที่จะเก็บการแทนค่ากลางไว้เป็นชนิดของนิพจน์ที่คอมไพล์แล้วสำหรับการประเมินในอนาคต แก้ไข : หลังจากที่แม้ว่าบางอย่างเกี่ยวกับปัญหาที่เกิดขึ้นผมคิดว่าผมสามารถสร้างตัวแทนต้นไม้ในการแสดงออกของฉัน (เป็น AST แทนกระแสโทเค็นเชิงเส้น) if()จากที่ผมได้อย่างง่ายดายสามารถละเว้นหนึ่งหรือสาขาอื่นของฉัน

3
การใช้การแปลงอาร์กิวเมนต์โดยนัยถือว่าเป็นอันตรายหรือไม่
C ++ มีคุณสมบัติ (ฉันไม่สามารถหาชื่อที่ถูกต้องได้) ซึ่งเรียกการสร้างพารามิเตอร์ที่ตรงกันโดยอัตโนมัติหากประเภทอาร์กิวเมนต์ไม่ใช่ประเภทที่คาดไว้ ตัวอย่างพื้นฐานของสิ่งนี้คือการเรียกใช้ฟังก์ชันที่คาดว่าจะstd::stringมีconst char*อาร์กิวเมนต์ คอมไพเลอร์จะสร้างรหัสโดยอัตโนมัติเพื่อเรียกใช้std::stringConstructor ที่เหมาะสม ฉันสงสัยว่ามันดีสำหรับการอ่านอย่างที่คิดหรือไม่? นี่คือตัวอย่าง: class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); ไม่เป็นไรใช่ไหม หรือมันไปไกลเกินไป? ถ้าฉันไม่ควรทำฉันจะทำให้ Clang หรือ GCC เตือนได้ไหม?

6
ฟังก์ชัน CoffeeScript และตั้งชื่อ
ที่อื่นอาร์กิวเมนต์ได้เกิดขึ้นกับคำศัพท์ของฟังก์ชั่นที่มีชื่อใน CoffeeScript โดยเฉพาะใครบางคนที่พูดถึงสิ่งนี้: foo = -> console.log("bar") เป็นฟังก์ชั่นที่มีชื่อ แต่มันถูกคัดค้านว่าทุกอย่างใน CoffeeScript เป็นฟังก์ชั่นที่ไม่ระบุชื่อและไม่มีฟังก์ชั่นที่มีชื่อ นี่เป็นความจริงแน่นอน CoffeeScript มีเพียงนิพจน์ฟังก์ชันที่สามารถเก็บไว้ในตัวแปรได้ แต่ฉันไม่คิดว่านั่นหมายความว่าการเรียกชื่อฟังก์ชันนี้ผิด อย่างที่ฉันเห็นมันเป็นฟังก์ชั่นที่มีชื่อเพราะฟังก์ชั่นที่ได้รับการตั้งชื่อ จริงมันไม่ใช่ฟังก์ชั่นที่ตั้งชื่อในลักษณะเดียวกับภาษาอื่น ๆ ที่มีชื่อฟังก์ชั่น แต่ฉันคิดว่ามันใกล้พอที่จะเรียกมันว่าฟังก์ชั่นที่มีชื่อไม่เหมาะสม เพื่อยืนยันเป็นอย่างอื่นก็ดูเหมือนว่าจะเป็น nitpicking ฉันออกไปทานข้าวกลางวันด้วยความคิดว่าการยืนยันว่านี่ไม่ใช่ฟังก์ชั่นที่ตั้งชื่อหรือไม่

5
มีวิธีการใช้ gcc เป็นห้องสมุดหรือไม่?
ทุกคนรู้วิธีแก้ปัญหาที่ใช้งานได้เช่นนี้: #include <stdio.h> #include <gcc.h> /* This .h is what I'm looking for. */ int main (void) { /* variables declaration (...) */ /* The following line is supposed to be equivalent to: * $ gcc main.c -o main */ results = gcc_compile_and_link("main.c", "main"); /* Now I want to use …
10 c++  c  gcc 

1
โครงสร้างข้อมูลที่เหมาะสมที่สุดสำหรับ API ของเราเอง
ผมอยู่ในขั้นเริ่มต้นของการเขียนโหมด Emacs สำคัญสำหรับเครือข่ายการแลกเปลี่ยนชุด ; หากคุณใช้ Emacs เป็นประจำสิ่งนี้จะเป็นประโยชน์กับคุณในที่สุด เพื่อลดจำนวนการโทรที่เกิดขึ้นกับ Stack Exchange API (ต่อยอดที่ 10,000 ต่อ IP ต่อวัน)และเพื่อเป็นพลเมืองที่รับผิดชอบโดยทั่วไปฉันต้องการแคชข้อมูลที่ฉันได้รับจากเครือข่ายและเก็บไว้ในหน่วยความจำรอ สามารถเข้าถึงได้อีกครั้ง ฉันติดอยู่กับโครงสร้างข้อมูลเพื่อเก็บข้อมูลนี้ เห็นได้ชัดว่ามันจะเป็นรายการ อย่างไรก็ตามเช่นเดียวกับโครงสร้างข้อมูลใด ๆ ตัวเลือกจะต้องถูกกำหนดโดยข้อมูลที่จัดเก็บและสิ่งที่จะเข้าถึง stack-api/cacheสิ่งที่ผมอยากจะสามารถที่จะเก็บข้อมูลทั้งหมดนี้ในสัญลักษณ์เดียวเช่น ดังนั้นโดยไม่มีความกังวลใจต่อไปstack-api/cacheนี้เป็นรายการของข้อตกลงที่ได้รับการปรับปรุงล่าสุด: `(<csite> <csite> <csite>) <csite>จะอยู่ที่ไหน (1362501715 . <site>) ณ จุดนี้ทั้งหมดที่เราได้ทำมีกำหนดที่เรียบง่ายรายชื่อสมาคม แน่นอนว่าเราจะต้องไปลึก แต่ละ<site>รายการของพารามิเตอร์ API (เฉพาะ) ตามด้วยคำถามรายการ: `("codereview" <cquestion> <cquestion> <cquestion>) แต่ละข้อ<cquestion>คุณเดาเอาว่าเป็นคำถามที่มีเวลาอัปเดตล่าสุด: `(1362501715 <question>) (1362501720 . <question>) <question>เป็นข้อเสียของquestionโครงสร้างและรายชื่อของคำตอบ (อีกครั้ง …

6
ทดสอบไคลเอ็นต์ REST กับเซิร์ฟเวอร์ REST ติดตั้งอย่างไร?
เมื่อเขียนการทดสอบหน่วยเป็นเรื่องปกติที่จะใช้อุปกรณ์ติดตั้ง: ข้อมูลที่ทดสอบได้เพียงเล็กน้อยดังนั้นเราจึงสามารถพูดได้: 1. รับลูกค้าทั้งหมดควรรวม Willy Wonka 2. ลบไคลเอนต์ 3 และตอนนี้รับไคลเอนต์ไม่ควรรวมวิลลี่วองก้าอีกต่อไป ไม่เป็นไรสำหรับการทดสอบหน่วย ใช้การตั้งค่า / การลดระดับเพื่อโหลดการแข่งขันอีกครั้งหรือย้อนกลับการทำธุรกรรม ดังนั้นการทดสอบสร้างปรับปรุงและลบจะทำภายในการทำธุรกรรม ข้อมูลชั่วคราวใหม่มีจำนวน จำกัด ตามความยาวของการทดสอบนั้นจะถูกรีเซ็ต แต่จะเกิดอะไรขึ้นเมื่อเราแยกเซิร์ฟเวอร์ REST ออกจากไคลเอนต์ REST เราต้องการตรวจสอบให้แน่ใจว่าลูกค้า REST ของเราไม่เพียง แต่อ่านอย่างถูกต้อง แต่สร้างอัปเดตและลบอย่างถูกต้อง ฉันไม่สามารถค้นหาตัวอย่างหรือคำแนะนำสำหรับวิธีการนี้กับเซิร์ฟเวอร์ REST ทดสอบระยะไกล สมมติว่าฉันได้ทดสอบเซิร์ฟเวอร์ REST ที่ให้บริการติดตั้งเท่านั้น ลักษณะไร้สัญชาติทั้งหมดของ HTTP หมายความว่าเป็นการยากที่จะส่ง "BEGIN TRANSACTION" และ "ROLLBACK TRANSACTION" หรือ "RELOAD FIXTURES" ประเภทข้อความใช่ไหม ฉันไม่สามารถเป็นคนแรกที่ต้องการทำสิ่งนี้ดังนั้นฉันจึงรู้สึกว่าฉันต้องการวิธีคิดที่แตกต่างออกไป ข้อเสนอแนะใด ๆ
10 unit-testing  api  rest 

1
สร้างระบบคอมพิวเตอร์ด้วย JS หรือไม่ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันเพิ่งเสร็จสิ้นหนังสือเล่มนี้ชื่อว่า The Elements of Computing Systems ซึ่งคุณสร้างระบบคอมพิวเตอร์ที่ใช้งานได้ตั้งแต่เริ่มต้นตั้งแต่ประตูตรรกะพื้นฐานไปจนถึงการสร้างรหัสเครื่องและภาษาแอสเซมบลีของคุณเองจนถึงรหัสกลาง ภาษาการเขียนโปรแกรมที่รวบรวมลงในรหัส VM ฉันสนุกกับมันมากและฉันต้องการสร้างสิ่งที่คล้ายกันใน JavaScript แต่มีคุณสมบัติเพิ่มเติม ฉันได้เขียนโปรแกรมจำลองสำหรับเครื่องแฮ็คใน JS: // Creates a new CPU object that is responsible for processing instructions var CPU = function() { var D = 0; // D Register var A = 0; // …
10 javascript 

3
รายการพารามิเตอร์ของวิธีการควรมีวัตถุหรือตัวระบุวัตถุ?
ทีมของเรากำลังสนทนากันดังต่อไปนี้: สมมติว่าเรามีสองวิธีต่อไปนี้: public Response Withdraw(int clubId, int terminalId,int cardId, string invoice, decimal amount); public Response Withdraw(Club club, Terminal terminal,Card card, string invoice, decimal amount); อะไรที่ส่งผ่านสายเป็นเพียงรหัส ด้านหนึ่งบอกว่าวิธีแรกนั้นถูกต้องเพราะเรามีรหัสเทอร์มินัลและคลับเท่านั้นและควรชัดเจนว่าเราไม่มีอะไรอย่างอื่นนี่คือแนวทางของฉัน อีกด้านหนึ่งบอกว่าวิธีที่สองนั้นถูกต้องเพราะมีความยืดหยุ่นมากกว่า เราคุ้นเคยกับแนวคิดพารามิเตอร์วัตถุอีกด้านหนึ่งคิดว่าพารามิเตอร์วัตถุควรมีวัตถุเป็นคุณสมบัติ วิธีใดที่ถูกต้อง อาจจะมีวิธีที่สามที่ดียิ่งขึ้น?
10 design  methods 

3
เราสามารถเพิ่มการไหลของข้อมูลระหว่างส่วนต่าง ๆ ของรหัสฐานขนาดใหญ่ได้ง่ายขึ้นหรือไม่
เมื่อทำการเปลี่ยนแปลงกับระบบขนาดใหญ่ฉันมักประสบปัญหาว่าบางส่วนของฟังก์ชั่นจำเป็นต้องได้รับข้อมูลบางอย่างจากอีกส่วนหนึ่ง แต่พวกมันอยู่ในส่วนต่าง ๆ ของทรีเรียกที่ลึกและแตกแขนงซึ่งอาจไหลผ่านผู้ฟังเหตุการณ์ เป็นต้นด้วยวิธีนี้การเปลี่ยนแปลงอย่างง่ายสามารถทำให้บอลลูนได้อย่างรวดเร็ว ข้อความอ้างอิงจาก Yossi Kreinin บล็อกโพสต์ที่http://www.yosefk.com/blog/i-want-a-struct-linker.html : คุณมีโครงสร้างข้อมูลบางอย่างที่คุณผ่านไปมาก ในไม่ช้าสิ่งที่มีค่าที่สุดเกี่ยวกับโครงสร้างไม่ใช่ข้อมูลที่เก็บไว้ แต่ความจริงที่ว่ามันมีอยู่ตลอดทางผ่านการควบคุมที่ไหลลื่น ตัวแปรทั่วโลกเป็นวิธีคลาสสิกวิธีหนึ่งในการปล่อยให้รหัส "ตะโกนออก" ไปยังรหัสที่อยู่ไกล แต่พวกเขารู้ว่าเป็นปัญหา ตัวแปรที่กำหนดขอบเขตแบบไดนามิกเป็นวิธีที่ จำกัด มากขึ้น แต่ก็มีปัญหาเช่นกัน มีการวิจัยภาษาโปรแกรมเพื่อแก้ไขปัญหานี้หรือไม่? เราสามารถเพิ่มการไหลของข้อมูลที่ไม่คาดคิดลงในฐานข้อมูลขนาดใหญ่ได้ง่ายขึ้นหรือไม่ในขณะที่ยังคงมีการตรวจสอบแบบคงที่การทดสอบหน่วยง่ายและสารพัดอื่น ๆ

2
คลาสบริบทในรูปแบบกลยุทธ์
ฉันพยายามที่จะเข้าใจรูปแบบกลยุทธ์และถามตัวเองว่า: คลาสบริบทต้องมีหรือฉันสามารถละทิ้งมันโดยไม่ลดทอนจุดประสงค์ของรูปแบบ? ฉันตกอยู่ในความประทับใจฉันต้องการสวิตช์บางอย่างสำหรับอ่านไฟล์ประเภทต่าง ๆ แต่ไม่ต้องการแฮ็กข้อมูลและจัดการกับการรีแฟคเตอร์ใหม่ในภายหลัง (แม้ว่าแน่นอนว่ามันเกิดขึ้นเสมอว่าโค้ดสามารถรีเฟรชได้ แต่ความคิดคือ: ลอง จะฉลาดเท่าที่จะเป็นไปได้ในการออกแบบล่วงหน้า ... ): ภาพที่นำมาจากวิกิมีเดีย ลูกค้าสามารถมอบหมายโดยตรงไปยังส่วนต่อประสานกลยุทธ์หรือมีบางสิ่งที่ฉันเพิ่งพลาดที่จะเข้าใจเกี่ยวกับคลาสบริบทหรือไม่ interface Reader { // read information from file and fill data list field of Client readFile(); } class ExcelReader implements Reader{ /* */ } class PdfReader implements Reader{ /* */} class Client{ // strategic choice Reader r; …

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