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

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

1
การสุ่มแบบ Python ทำงานอย่างไร
shuffle จากการสุ่มทำงานใน Python อย่างไร ฉันถามเพราะมันใช้งานได้เร็วมาก เมื่อฉันพยายามเขียน shuffle มันจะทำงาน 1 นาทีสำหรับองค์ประกอบ 10 ^ 6 แต่ Python shuffle ทำใน 8 วินาทีหรือไม่
11 python  random 

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

3
ใช้การทดสอบสาขาใน Git
เรามีใครบางคน (เรียกเขาว่าเท็ด) ที่รับผิดชอบการทดสอบคุณสมบัติใหม่และการแก้ไขข้อบกพร่อง เรากำลังใช้GitและGitHub masterควร / สามารถใช้งานได้เสมอและdevelopmentเป็นสถานที่ที่เรายอมรับ / รวมคุณสมบัติใหม่หรือแก้ไขข้อผิดพลาด แต่หลังจากที่พวกเขาได้รับการทดสอบโดยเท็ด โครงการอยู่ใน PHP ฉันต้องการให้กระบวนการทดสอบเป็นไปตามนี้: ผู้พัฒนาต้องการทำงานกับคุณสมบัติใหม่ (สมมติว่าคุณสมบัติ / ข้อผิดพลาด # 123 เป็นเอกสาร Ted ในตัวติดตามปัญหา) ดังนั้นเขาจึงดึงorigin/developmentไปdevelopmentที่ที่เก็บในเครื่องของเขาและสร้างสาขาใหม่ (สมมติว่าissue-123) จากที่นั่น originเมื่อเขามีความสุขกับการทำงานของเขาเขามุ่งมั่นและผลักดันสาขาใหม่ของเขาไป เท็ดเชื่อมต่อtest.ourproject.com/choose-branchและดูรายการของสาขาoriginและเลือกที่จะเปิดissue-123(มันควรจะทำได้ผ่านหน้าเว็บ) จากนั้นเขาก็test.ourproject.comทำการทดสอบนรกจากเว็บแอปพลิเคชั่น (เขาเป็นคนที่ไร้ความปราณี) และหลังจากกลับมากับนักพัฒนาเขามีความสุขกับคุณสมบัตินี้ เท็ดบอกนักพัฒนาที่ว่าเขาสามารถผสานissue-123เข้าสู่บนdevelopmentorigin ล้างและทำซ้ำ สำหรับขั้นตอนที่สามฉันสามารถแฮ็คสิ่งที่ทำงาน (แสดงและสลับสาขาจากหน้าเฉพาะ) แต่ฉันรู้สึกว่าสิ่งที่ฉันอธิบายไว้เป็นรูปแบบทั่วไปมาก ดังนั้นคำถามของฉันคือ: นี่เป็นเวิร์กโฟลว์ที่ดี / ยั่งยืน / บำรุงรักษาได้สำหรับการแยกหรือไม่ คุณสามารถสำรองคำตอบของคุณโดยอ้างตัวอย่างของโครงการอื่น ๆ ที่ติดตามเวิร์กโฟลว์นี้หรือไม่?

4
การจัดการการหมดเวลาของเซสชันผู้ใช้ในแอป SaaS - พูดคุยถึงวิธีการหลายวิธี
ฉันรู้ว่านี่เป็นโอกาสที่ดีที่จะถูกทำเครื่องหมายว่าซ้ำซ้อน แต่ไม่พบสิ่งที่ฉันกำลังมองหา นี่เป็นปัญหาที่พบบ่อยและฉันแน่ใจว่ามันมีวิธีปฏิบัติที่ดีที่สุดที่กำหนดไว้ พื้นหลัง แอป SaaS หน้าเดียวมีจำนวนมากลากและวางผู้ใช้สามารถโต้ตอบกับมันโดยไม่ต้องสื่อสารกับเซิร์ฟเวอร์เป็นระยะเวลานาน เซสชันเซิร์ฟเวอร์เก็บวัตถุผู้ใช้เท่านั้นโดยใช้คุกกี้เซสชันที่ไม่ถาวร เซสชันหมดอายุบนเซิร์ฟเวอร์หลังจาก X ชั่วโมง บางสิ่งถูกโหลดระหว่างการล็อกอินเท่านั้น ปัญหา ผู้ใช้ทำงานบนแอปเมื่อเสร็จแล้วผู้ใช้จะไม่ออกจากระบบเพียงเปิดเบราว์เซอร์ต่อไป ผู้ใช้กลับมาหลังจากผ่านไปนานกว่า X ชั่วโมง (เซสชันไม่ถูกต้องบนเซิร์ฟเวอร์) ผู้ใช้โต้ตอบกับแอปโดยไม่จำเป็นต้องเชื่อมต่อเซิร์ฟเวอร์ (ลากและวางสิ่งของแก้ไขข้อความ ... ) เฉพาะในการโต้ตอบเซิร์ฟเวอร์ครั้งต่อไป (สมมติว่าไม่มีการบันทึกอัตโนมัติ) ผู้ใช้จะถูกส่งไปยังหน้าเข้าสู่ระบบและสูญเสียงานบางส่วนของพวกเขา การแก้ปัญหาที่เป็นไปได้ นี่คือวิธีแก้ปัญหาบางอย่างที่ฉันมีในใจอยากจะได้ยินหากมีคนอื่นและถ้ามีอะไรผิดปกติกับพวกเขา 1. อย่าล็อกผู้ใช้ออก อย่างไร? อาจเก็บเซสชันที่ยาวนานเก็บคุกกี้ถาวรหรือ ping javaScript "keep alive" ข้อดี : ผู้ใช้ไม่จำเป็นต้องกังวลอะไรเลยแก้ไขปัญหาให้พวกเขา ข้อด้อย : ไม่เป็นไปตามมาตรฐาน PCI ไม่ปลอดภัยและต้องการการเปลี่ยนแปลงการพัฒนาเช่นสิ่งที่โหลดไปยังเซสชันเฉพาะเมื่อเข้าสู่ระบบของผู้ใช้จำเป็นต้องย้ายไปที่รูปแบบย่อย pub (ฟังการเปลี่ยนแปลงเหตุการณ์) หรือหมดเวลาแคช 2. การจัดเก็บในท้องถิ่น อย่างไร? ใช้ที่จัดเก็บในตัวเครื่องใหม่เพื่อเก็บสถานะไว้ชั่วคราวหากออกจากระบบเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบยังคงมีอยู่เมื่อลงชื่อเข้าใช้ …

3
มีบางสิ่งที่พิเศษเกี่ยวกับหมายเลข 65535 หรือไม่?
2¹⁶-1 & 2⁵ = 2⁵ (หรือ? ชัด?) ผู้พัฒนาถามฉันในวันนี้ 65535 & 32 bitwise คือ2¹⁶-1 & 2⁵ =? ตอนแรกฉันคิดว่าเป็นไปตามธรรมชาติ 32 แต่ดูเหมือนง่ายที่ฉันคิดว่าเป็นเวลาหลายนาทีแล้วตอบ 32. 32 ดูเหมือนจะเป็นคำตอบที่ถูกต้อง แต่อย่างไร 65535 = 2¹⁶-1 = 1111111111111111 (แต่มันดูไม่ถูกต้องเพราะเลขฐานสองนี้ทั้งหมดควรเป็น -1 (?)), 32 = 100,000 แต่ฉันไม่สามารถแปลงมันในหัวของฉันดังนั้นฉันตอบ 32 แล้วตั้งแต่ฉัน เพื่อตอบคำถาม คำตอบที่ 32 เป็นเรื่องจริงเล็กน้อย เป็นเช่นเดียวกัน 2 same-1 & 2 &-1 = 31 หรือไม่ …

1
รูปแบบที่ไม่ดีคือการเปลี่ยนตารางหลายตารางในไฟล์การโยกย้าย Rails ไฟล์เดียวหรือไม่?
ฉันเขียนไฟล์การโยกย้ายพร้อมรหัสต่อไปนี้: class AddScheduleIdToPlayers < ActiveRecord::Migration def change add_column :players, :schedule_id, :integer add_column :schedules, :coach_id, :integer end end เป็นรูปแบบที่ไม่ถูกต้องหรือไม่ที่จะไม่สร้างไฟล์การโยกย้ายสองไฟล์หนึ่งไฟล์สำหรับการเปลี่ยนแปลงแต่ละครั้ง

2
มีการใช้เธรดจำนวนเท่าใด
เมื่อฉัน (อีกครั้ง) สร้างระบบขนาดใหญ่บนคอมพิวเตอร์เดสก์ท็อป / แล็ปท็อปฉันบอกmakeให้ใช้มากกว่าหนึ่งเธรดเพื่อเร่งความเร็วในการรวบรวมเช่นนี้: $ make -j$[ $K * $C ] ที่$Cควรจะระบุจำนวนแกน (ซึ่งเราสามารถถือว่าเป็นตัวเลขที่มีหนึ่งหลัก) เครื่องมีในขณะที่$Kเป็นสิ่งที่ฉันแตกต่างจาก2ไป4ขึ้นอยู่กับอารมณ์ของฉัน ตัวอย่างเช่นฉันอาจบอกว่าmake -j12ฉันมี 4 แกนระบุว่าmakeจะใช้ถึง 12 กระทู้ เหตุผลของฉันคือถ้าฉันใช้เฉพาะ$Cเธรดแกนจะว่างขณะที่กระบวนการกำลังดึงข้อมูลจากไดรฟ์ แต่ถ้าฉันไม่ จำกัด จำนวนเธรด (เช่นmake -j) ฉันเสี่ยงที่จะเสียเวลาในการสลับบริบท, หน่วยความจำไม่เพียงพอหรือแย่กว่านั้น สมมติว่าเครื่องมี$Mหน่วยความจำกิ๊ก ( $Mอยู่ในอันดับ 10) ดังนั้นฉันสงสัยว่ามีกลยุทธ์ที่จัดตั้งขึ้นเพื่อเลือกจำนวนเธรดที่มีประสิทธิภาพมากที่สุดที่จะเรียกใช้หรือไม่

3
มันเป็นสิ่งสำคัญที่ทำให้งงงวยรหัสแอปพลิเคชัน C ++?
ในโลก Java ดูเหมือนว่าบางครั้งจะมีปัญหา แต่สิ่งที่เกี่ยวกับ C ++? มีวิธีแก้ไขปัญหาต่าง ๆ หรือไม่? ฉันคิดเกี่ยวกับความจริงที่ว่าบางคนสามารถแทนที่ไลบรารี C ++ ของระบบปฏิบัติการที่เฉพาะเจาะจงด้วยเวอร์ชันเดียวกันของไลบรารีเดียวกัน แต่เต็มไปด้วยสัญลักษณ์การดีบักเพื่อทำความเข้าใจว่าโค้ดของฉันทำอะไร การใช้ไลบรารีมาตรฐานหรือห้องสมุดยอดนิยมเป็นสิ่งที่ดีหรือไม่? สิ่งนี้สามารถเกิดขึ้นได้กับไลบรารี่ dll บางตัวใน Windows แทนที่ด้วย "debug version" ของไลบรารี่นั้น มันจะดีกว่าที่จะรวบรวมแบบคงที่? ในแอพพลิเคชั่นเชิงพาณิชย์ฉันเห็นว่าแกนหลักของแอพของพวกเขารวบรวมทุกอย่างในแบบสแตติกและส่วนใหญ่ dll (ไลบรารีไดนามิกทั่วไป) ใช้เพื่อเสนอเทคโนโลยีของบุคคลที่สามเช่นโซลูชั่นต่อต้านการละเมิดลิขสิทธิ์ (ฉันเห็นในเกมหลายเกม ), ไลบรารี GUI (เช่น Qt), ไลบรารี OS ฯลฯ การรวบรวมแบบคงที่เทียบเท่ากับการทำให้งงงวยในโลก Java หรือไม่? ในแง่ที่ดีกว่าเป็นวิธีที่ดีที่สุดและประหยัดที่สุดในการปกป้องรหัสของคุณหรือไม่?

3
คัมภีร์ไบเบิลของ Hashing คืออะไร
มีการอ้างอิงเหมือนCormenเกี่ยวกับแฮชและแฮชหรือไม่? โครงสร้างเฉพาะนี้ได้รับความสนใจเล็กน้อยในการศึกษา CS ของฉันด้วยเหตุผลบางอย่าง แต่ฉันต้องการเรียนรู้เพิ่มเติมเนื่องจากดูเหมือนว่าจะอยู่ทุกที่ ฉันรู้ว่า Cormen ครอบคลุม แต่ฉันกำลังมองหาบางสิ่งที่พิเศษและลึกซึ้งกว่านี้

3
ลินุกซ์กราฟิกระดับต่ำ
เพื่อจุดประสงค์ด้านการศึกษาฉันต้องการเขียนแอปพลิเคชันบนสภาพแวดล้อม Linux ที่สามารถประมวลผลเหตุการณ์แป้นพิมพ์และวาดภาพกราฟิกโดยไม่ต้องพึ่งพา X หรือ SDL ขนาดใหญ่ ฉันคิดว่าสิ่งนี้จะต้องเป็นไปได้เพราะ X และ SDL เป็นเพียงโปรแกรมตัวเองดังนั้นพวกเขาจึงต้องพึ่งพาวิธีการอื่น ๆ ที่มีอยู่ในสภาพแวดล้อม ความเข้าใจนี้ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นฉันจะเรียนรู้การเขียนโปรแกรมได้ที่ไหน? ประสบการณ์ที่ จำกัด ของฉันบอกฉันว่ามันจะเกี่ยวข้องกับการโทรไปยังเคอร์เนลและ / หรือการเขียนไปยังไฟล์พิเศษ อย่างไรก็ตามฉันไม่สามารถหาบทช่วยสอนใด ๆ ในเรื่องนี้ (ฉันไม่แน่ใจด้วยซ้ำว่าจะใช้ Google) นอกจากนี้ในกรณีที่มีความเกี่ยวข้องฉันใช้ Debian Squeeze บน Virtualbox ฉันใช้แผ่นซีดี netinst โดยไม่ใช้ระบบเครือข่ายดังนั้นจึงยังไม่มีการติดตั้งในส่วนนี้มากนัก ฉันจะติดตั้งgccแต่ฉันหวังว่าฉันจะได้รับโดยไม่มีอะไรเพิ่มเติม
11 linux  graphics 

3
เหตุผลเบื้องหลังการใช้งาน C # String.Split () ที่ไม่เข้าใจง่าย
ใน C # ถ้าฉันต้องการแยก a stringอีกอันstringฉันต้องทำสิ่งนั้น: testString.Split(new string[] { "anotherString" }, StringSplitOptions.None); จากString.Splitเอกสาร MSDN ที่มีการโอเวอร์โหลดเราสามารถเห็นการใช้งานและสาเหตุที่ต้องทำการโทร มาจากPythonมันยากสำหรับฉันที่จะเข้าใจอย่างถูกต้องว่าทำไมจึงต้องมีการโทร ฉันหมายความว่าฉันสามารถใช้Regex.Splitเพื่อให้ได้ไวยากรณ์ที่คล้ายกันมากกว่าการดำเนินการของงูใหญ่ แต่ผมจะต้องทำมันที่ค่าใช้จ่ายของประสิทธิภาพการทำงานน้อยกว่า (เวลาการติดตั้ง) สำหรับอะไรที่เรียบง่าย โดยพื้นฐานแล้วคำถามของฉันคือทำไมเราทำไม่ได้: testString.Split("anotherString"); โปรดทราบว่าฉันไม่ได้แนะนำต้นแบบหรือการนำไปใช้ใด ๆ ฉันเข้าใจว่าทำไมคุณไม่สามารถใช้เวอร์ชันด้านบนเนื่องจาก API ปัจจุบัน เป้าหมายของฉันคือเข้าใจว่าทำไม API ดังกล่าวจึงถูกสร้างขึ้นโดยคำนึงถึงประโยชน์ที่ไวยากรณ์ข้างต้นนำมา ณ ตอนนี้ความยืดหยุ่นดูเหมือนจะเป็นเป้าหมายของกระแสString.Splitที่เข้าท่า แต่ตามจริงแล้วฉันคิดว่าจริงๆแล้วมีการแสดงบางอย่างที่ได้รับบ้าง ฉันเดาว่าฉันผิด

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

4
สิ่งที่ควรพิจารณาเพื่อพิจารณาว่าคุณสามารถใช้การเรียกซ้ำเพื่อแก้ไขปัญหาได้หรือไม่
บางครั้งในการสัมภาษณ์ฉันอาจใช้การสอบถามซ้ำเพื่อแก้ปัญหา (เช่นการเพิ่ม1จำนวนเต็มความแม่นยำที่ไม่มีที่สิ้นสุด) หรือเมื่อปัญหานำเสนอตัวเองที่เหมาะสมในการใช้การสอบถามซ้ำ บางครั้งอาจเป็นเพราะการใช้การเรียกซ้ำหลายครั้งเพื่อแก้ปัญหาดังนั้นโดยไม่ต้องคิดมากการเรียกซ้ำจะใช้เพื่อแก้ปัญหา อย่างไรก็ตามสิ่งที่ต้องพิจารณาก่อนที่คุณจะสามารถตัดสินใจได้ว่าจะใช้การเรียกซ้ำเพื่อแก้ไขปัญหาได้อย่างไร ฉันมีความคิดบางอย่าง: หากเราใช้การเรียกซ้ำข้อมูลซึ่งลดลงครึ่งหนึ่งทุกครั้งดูเหมือนว่าไม่มีปัญหาในการเรียกซ้ำเนื่องจากข้อมูลทั้งหมดที่สามารถพอดีกับ RAM ขนาด 16GB หรือแม้กระทั่งฮาร์ดไดรฟ์ 8TB สามารถจัดการได้โดยการเรียกซ้ำเพียง 42 ระดับ (ดังนั้นจึงไม่มีการล้นสแต็ค (ฉันคิดว่าในสภาพแวดล้อมบางอย่างสแต็คอาจมีความลึก 4000 ระดับทางมากกว่า 42 แต่ในขณะเดียวกันก็ขึ้นอยู่กับว่าคุณมีตัวแปรเฉพาะที่คุณมีเท่าไรในแต่ละสแตกการโทร หากมีตัวแปรโลคัลจำนวนมากและเป็นขนาดหน่วยความจำไม่ใช่ระดับซึ่งกำหนดสแต็กโอเวอร์โฟลว์)) หากคุณคำนวณหมายเลขฟีโบนักชีโดยใช้การเรียกซ้ำแบบบริสุทธิ์คุณต้องกังวลเกี่ยวกับความซับซ้อนของเวลาเว้นแต่ว่าคุณจะแคชผลลัพธ์ระดับกลาง และวิธีการเกี่ยวกับการเพิ่ม1จำนวนเต็มความแม่นยำอนันต์? บางทีมันอาจจะเป็นที่ถกเถียงกันเช่นคุณจะทำงานกับตัวเลขที่มีความยาว 3000 หลักหรือยาว 4000 หลักใหญ่จนสามารถทำให้เกิดการล้นสแต็กหรือไม่ ฉันไม่ได้คิด แต่บางทีคำตอบคือไม่เราไม่ควรใช้การเรียกซ้ำ แต่ใช้ลูปธรรมดาเพราะถ้าในบางแอปพลิเคชันจำนวนจริง ๆ ต้องยาว 4000 หลักเพื่อตรวจสอบบางอย่าง คุณสมบัติของตัวเลขเช่นว่าเป็นจำนวนเฉพาะหรือไม่ คำถามสุดท้ายคือสิ่งที่ต้องพิจารณาก่อนที่คุณจะตัดสินใจใช้การเรียกซ้ำเพื่อแก้ไขปัญหา

7
ฉันจะใช้ TDD กับฟังก์ชั่นอ่าน / เขียนได้อย่างไร?
ดูเหมือนว่าปัญหาไก่และไข่ คุณสามารถทำให้เขียนฟังก์ชั่นเขียนไปยังแหล่งข้อมูลบางอย่าง แต่ไม่เคยรู้ว่าคุณบันทึกไว้อย่างถูกต้องโดยไม่ต้องฟังก์ชั่นการอ่านการทดสอบ คุณสามารถทำให้อ่านฟังก์ชั่นการอ่านจากแหล่งข้อมูล แต่คุณจะใส่สิ่งต่าง ๆ ในแหล่งข้อมูลที่จะอ่านโดยไม่ต้องฟังก์ชั่นการเขียนการทดสอบได้อย่างไร แก้ไข: ฉันกำลังเชื่อมต่อและทำธุรกรรมกับฐานข้อมูล SQL เพื่อบันทึกและโหลดวัตถุเพื่อใช้งาน ไม่มีจุดทดสอบฟังก์ชั่นการเข้าถึงที่ DB ให้ แต่ฉันตัดฟังก์ชั่น DB ดังกล่าวเพื่อทำให้เป็นอันดับ / ดีซีเรียลไลซ์วัตถุ ฉันต้องการให้แน่ใจว่าฉันเขียนและอ่านสิ่งที่ถูกต้องไปยังและจากฐานข้อมูลอย่างถูกต้อง มันไม่เหมือนการเพิ่ม / ลบตามที่ @snowman กล่าวถึง ฉันต้องการทราบว่าเนื้อหาที่ฉันเขียนนั้นถูกต้อง แต่ต้องใช้ฟังก์ชั่นการอ่านที่ผ่านการทดสอบเป็นอย่างดี เมื่อฉันอ่านฉันต้องการให้แน่ใจว่าการอ่านของฉันได้สร้างวัตถุอย่างถูกต้องเท่ากับสิ่งที่เขียน; แต่นั่นต้องมีฟังก์ชั่นการเขียนที่ผ่านการทดสอบเป็นอย่างดี
10 tdd  io 

6
แนวปฏิบัติบูลีนที่ดีที่สุด [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันเจอเงื่อนไขต่อไปนี้ในโปรแกรมที่ฉันได้ยึดครองจากผู้พัฒนารายอื่น: if (obj.Performance <= LOW_PERFORMANCE) { obj.NeedsChange = true; } else { obj.NeedsChange = false; } ฉันเชื่อว่ารหัสนี้ซ้ำซ้อนและน่าเกลียดดังนั้นฉันจึงเปลี่ยนเป็นสิ่งที่ฉันคิดว่าเป็นการมอบหมายบูลีนอย่างง่ายจากการเปรียบเทียบ: obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE; เมื่อเห็นสิ่งนี้มีคนกำลังตรวจสอบรหัสของฉันแสดงความคิดเห็นว่าแม้ว่าการเปลี่ยนแปลงของฉันจะถูกต้องตามหน้าที่ แต่อาจทำให้ผู้อื่นดูสับสน เขาเชื่อว่าการใช้ผู้ประกอบการสามคนทำให้การบ้านนี้ชัดเจนยิ่งขึ้นในขณะที่ฉันไม่ชอบการเพิ่มรหัสซ้ำซ้อนเพิ่มเติม: obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE) ? true : false; เหตุผลของเขาคือการทำบางสิ่งด้วยวิธีที่รัดกุมที่สุดนั้นไม่คุ้มค่าถ้ามันทำให้ผู้พัฒนารายอื่นต้องหยุดและไขปริศนาสิ่งที่คุณทำ คำถามจริงที่นี่คือวิธีใดในสามวิธีในการกำหนดค่าให้กับบูลีนobj.NeedsChangeที่ชัดเจนที่สุดและสามารถบำรุงรักษาได้มากที่สุด

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