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

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

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

6
วิธีการเทียบกับฟังก์ชั่นและขั้นตอน
คำถามง่าย ๆ แต่บ่อยครั้งที่ฉันได้ยินคำศัพท์สามคำที่นิยามด้วยความดุร้ายเช่นนี้ คำจำกัดความ "ถูกต้อง" ของ "ขั้นตอน", "วิธีการ", "ฟังก์ชั่น", "รูทีนย่อย" ฯลฯ คืออะไร?

13
คุณใช้“ แผนการตั้งชื่อเวอร์ชัน” อะไร [ปิด]
ข้อตกลงการตั้งชื่อเวอร์ชันต่างกันเหมาะสมกับโครงการที่แตกต่างกันหรือไม่ คุณใช้อะไรและทำไม โดยส่วนตัวแล้วฉันชอบหมายเลขบิลด์เป็นเลขฐานสิบหก (เช่น 11BCF) ซึ่งควรเพิ่มขึ้นเป็นประจำ จากนั้นสำหรับลูกค้าจะมีหมายเลขเวอร์ชัน 3 หลักอย่างง่ายคือ 1.1.3 1.2.3 (11BCF) <- Build number, should correspond with a revision in source control ^ ^ ^ | | | | | +--- Minor bugs, spelling mistakes, etc. | +----- Minor features, major bug fixes, etc. +------- Major version, UX changes, …

15
เมื่อใดจึงควรปรับให้เหมาะสมสำหรับหน่วยความจำและประสิทธิภาพความเร็วสำหรับวิธีการ?
ฉันเพิ่งสัมภาษณ์ที่อเมซอน ในระหว่างเซสชันการเข้ารหัสผู้สัมภาษณ์ถามว่าทำไมฉันถึงประกาศตัวแปรในวิธีหนึ่ง ฉันอธิบายกระบวนการของฉันและเขาท้าทายให้ฉันแก้ปัญหาเดียวกันโดยมีตัวแปรน้อยลง ยกตัวอย่างเช่น (นี่คือไม่ได้มาจากการสัมภาษณ์) ผมเริ่มต้นด้วยวิธี A:แล้วดีขึ้นก็จะวิธีการ Bint sโดยการเอา เขายินดีและกล่าวว่าวิธีนี้จะลดการใช้หน่วยความจำด้วยวิธีนี้ ฉันเข้าใจตรรกะเบื้องหลัง แต่คำถามของฉันคือ: เมื่อใดจึงเหมาะสมที่จะใช้วิธี A กับวิธี B และในทางกลับกัน คุณจะเห็นว่าA วิธีการที่เป็นไปได้ใช้หน่วยความจำที่สูงขึ้นเนื่องจากint sมีการประกาศ a + bแต่มันเท่านั้นที่มีการดำเนินการอย่างใดอย่างหนึ่งในการคำนวณคือ ในทางกลับกันวิธีการ Bมีการใช้หน่วยความจำลดลง แต่ต้องทำการคำนวณa + bสองครั้งคือสองครั้ง ฉันจะใช้เทคนิคหนึ่งเหนือเทคนิคอื่นได้อย่างไร หรือเป็นหนึ่งในเทคนิคที่ต้องการมากกว่าเสมอ? สิ่งที่ต้องพิจารณาเมื่อประเมินทั้งสองวิธีมีอะไรบ้าง วิธี A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 …

9
ฐานข้อมูลควรใช้ตรรกะทางธุรกิจเท่าใด
ฉันทำงานในบางโครงการที่ใช้ตรรกะทางธุรกิจส่วนใหญ่ในฐานข้อมูล (ส่วนใหญ่ผ่านขั้นตอนการจัดเก็บ) ในอีกด้านหนึ่งฉันได้ยินจากเพื่อนโปรแกรมเมอร์บางคนว่านี่เป็นวิธีปฏิบัติที่ไม่ดี ("ฐานข้อมูลอยู่ที่นั่นเพื่อเก็บข้อมูล วิธีใดบ้างที่ดีกว่า ข้อดีของการใช้ตรรกะทางธุรกิจในฐานข้อมูลที่ฉันนึกได้คือ: การรวมศูนย์ของตรรกะทางธุรกิจ ความเป็นอิสระของประเภทแอปพลิเคชันภาษาการเขียนโปรแกรมระบบปฏิบัติการ ฯลฯ ฐานข้อมูลมีแนวโน้มน้อยที่จะโยกย้ายเทคโนโลยีหรือปรับโครงสร้างครั้งใหญ่ (AFAIK); ไม่มีการทำงานซ้ำในการโยกย้ายเทคโนโลยีแอปพลิเคชัน (เช่น. NET เป็น Java, Perl เป็น Python เป็นต้น) ข้อเสีย: SQL นั้นมีประสิทธิผลน้อยกว่าและซับซ้อนกว่าสำหรับการเขียนโปรแกรมตรรกะทางธุรกิจเนื่องจากการขาดไลบรารี่และภาษาสร้างโครงสร้างของภาษาแอพพลิเคชั่นส่วนใหญ่ โค้ดที่ยากขึ้น (ถ้าเป็นไปได้ทั้งหมด) นำมาใช้ซ้ำผ่านไลบรารี IDE ที่มีประสิทธิผลน้อยลง หมายเหตุ: ฐานข้อมูลที่ฉันกำลังพูดถึงนั้นเป็นฐานข้อมูลเชิงสัมพันธ์ฐานข้อมูลยอดนิยมเช่น SQL Server, Oracle, MySql เป็นต้น ขอบคุณ!

13
คุณจะปรับรหัสเพิ่มเติมให้ถูกเขียนโดยทำตามวิธีปฏิบัติที่สะอาดของรหัสได้อย่างไร
ผู้ดำเนินรายการหมายเหตุ คำถามนี้มีคำตอบแล้วสิบเจ็ดคำตอบแล้ว ก่อนที่คุณจะโพสต์คำตอบใหม่โปรดอ่านคำตอบที่มีอยู่และตรวจสอบให้แน่ใจว่ามุมมองของคุณยังไม่ครอบคลุมเพียงพอ ฉันได้ปฏิบัติตามแนวทางปฏิบัติบางข้อที่แนะนำในหนังสือ "Clean Code" ของ Robert Martin โดยเฉพาะอย่างยิ่งวิธีการที่ใช้กับซอฟต์แวร์ประเภทที่ฉันทำงานด้วยและแนวทางที่เหมาะสมกับฉัน (ฉันไม่ปฏิบัติตามแนวคิด) . ผลข้างเคียงหนึ่งที่ฉันสังเกตเห็นคือรหัส "สะอาด" ที่ฉันเขียนนั้นเป็นรหัสมากกว่าที่ฉันไม่ได้ปฏิบัติตาม แนวทางปฏิบัติเฉพาะที่นำไปสู่สิ่งนี้คือ: Encapsulating conditionals ดังนั้นแทนที่จะ if(contact.email != null && contact.emails.contains('@') ฉันสามารถเขียนวิธีการขนาดเล็กเช่นนี้ private Boolean isEmailValid(String email){...} การแทนที่ความคิดเห็นแบบอินไลน์ด้วยวิธีส่วนตัวอื่น ๆ เพื่อให้ชื่อวิธีการอธิบายตัวเองมากกว่าที่จะมีความคิดเห็นแบบอินไลน์ด้านบนของมัน คลาสควรมีเหตุผลเดียวเท่านั้นที่จะเปลี่ยน และอีกไม่กี่คน ประเด็นคือสิ่งที่อาจเป็นวิธีการ 30 บรรทัดกลายเป็นชั้นเรียนเพราะวิธีการเล็ก ๆ ที่แทนที่ความคิดเห็นและ encapsulate เงื่อนไข ฯลฯ เมื่อคุณรู้ว่าคุณมีวิธีการมากมายแล้วมัน "เข้าท่า" เพื่อ ใส่ฟังก์ชั่นทั้งหมดไว้ในคลาสเดียวเมื่อจริง ๆ แล้วมันควรเป็นวิธี ฉันทราบว่าการฝึกฝนใด ๆ …

9
ความกลัวของเว็บแอปที่ไม่ได้เป็น "การพิสูจน์ในอนาคต"
ฉันเป็นผู้พัฒนาเว็บของแอปพลิเคชันเว็บ SaaS ขนาดเล็กในท้องถิ่น ปัจจุบันมีลูกค้าประมาณครึ่งโหล ขณะที่ฉันออกแบบแอพพลิเคชั่นต่อไปฉันก็ยิ่งยากที่จะโน้มน้าวตัวเองให้ทุ่มเทเวลากับโครงการซึ่งเกิดขึ้นในช่วงเริ่มต้น เมื่อโตขึ้นกับโปรเจ็กต์และรหัสที่ฉันเขียนไปแล้วฉันกลัวว่างานเพิ่มเติมทั้งหมดที่ฉันทำจะถูกพลิกคว่ำในอนาคตอันใกล้นี้เมื่อแอปพลิเคชันเปลี่ยนขนาดไม่ได้เมื่อธุรกิจเติบโต ในฐานะนักศึกษามหาวิทยาลัยที่สมัครเข้าฝึกงานฉันมีนายจ้างถามตัวเลือกของฉันว่าจะไม่ใช้กรอบงานเว็บใด ๆ ระหว่างการสัมภาษณ์ซึ่งทำให้ฉันสงสัยในผลงานก่อนหน้าของฉันเพิ่มเติม ฉันไม่รู้โครงร่างเว็บใด ๆ และไม่รู้ว่าจะเริ่มใช้อันไหน ฉันได้ฝึกงานในฐานะนักพัฒนาเต็มสแต็คในเดือนมกราคมที่ซึ่งฉันจะเริ่มเรียนรู้เฟรมเวิร์กเอนด์ แต่แรงกดดันที่จะทำให้แอพพลิเคชั่นสิ้นสุดลงกำลังจะติดตั้งและฉันกำลังพิจารณาว่า ซึ่งเป็นสิ่งที่ฉันเคยทำมาก่อน แอพนี้ถูกสร้างขึ้นใน PHP และ jQuery (สำหรับการโทร AJAX) และใช้ MySQL สำหรับฐานข้อมูล ความคิดใด ๆ เกี่ยวกับวิธีที่ฉันสามารถเอาชนะบล็อกจิตนี้และเพื่อให้แน่ใจว่าแอปของฉันจะสามารถปรับขนาดได้? ขอบคุณล่วงหน้า.

11
ทีมของฉันควรเริ่มจากที่“ ทันสมัย” ที่ไหน? [ปิด]
ฉันเป็นนักพัฒนาใหม่ที่ค่อนข้างใหม่จากวิทยาลัย ในขณะที่อยู่ในวิทยาลัยและในระหว่างการหางานฉันพบว่ามีวิธีการพัฒนาซอฟต์แวร์ที่ "ทันสมัย" จำนวนมากที่การศึกษาของฉันขาด: การทดสอบหน่วยการบันทึกการทำฐานข้อมูลให้เป็นมาตรฐานการพัฒนาแบบเปรียว (เทียบกับแนวคิดแบบเปรียวทั่วไป) คู่มือ, การเปลี่ยนโครงสร้าง, การตรวจสอบโค้ด, ไม่มีวิธีการเอกสารที่เป็นมาตรฐาน (หรือแม้กระทั่งข้อกำหนด), ฯลฯ โดยรวมแล้วฉันไม่เห็นว่านี่เป็นปัญหา ฉันคาดว่างานแรกของฉันที่จะโอบกอดความคิดเหล่านี้ทั้งหมดและเพื่อสอนพวกเขาให้ฉันในงาน จากนั้นผมได้งานแรกของฉัน (การพัฒนาเว็บแบบเต็มสแต็ค) ที่เป็น บริษัท ขนาดใหญ่และฉันรู้ว่าเราทำไม่มีสิ่งเหล่านี้ ในความเป็นจริงฉันเป็นคนที่มีประสบการณ์น้อยที่สุดในทีมเป็นคนที่พยายามเป็นหัวหอกในการนำทีมของฉันให้เร็วขึ้นด้วยเทคนิคการเขียนโปรแกรม "ทันสมัย" เพราะฉันกังวลว่าการไม่ทำเช่นนั้นคือการฆ่าตัวตายอย่างมืออาชีพ ก่อนอื่นฉันเริ่มด้วยซอฟต์แวร์การบันทึก (log4J) แต่จากนั้นฉันก็รีบเขียนการแนะนำสไตล์ของตัวเองแล้วละทิ้งมันไปสู่การแนะนำสไตล์ Google - จากนั้นฉันก็รู้ว่าการพัฒนาเว็บ Java ของเราใช้ตัวควบคุมด้านหน้าเขียนด้วยมือ การยอมรับสปริงของเรา - แต่จากนั้นฉันก็รู้ว่าเราไม่ได้ทำการทดสอบหน่วย แต่ฉันก็เรียนรู้ฤดูใบไม้ผลิแล้วและอย่างที่คุณเห็นมันจะท่วมท้นเร็วเกินไปโดยเฉพาะเมื่อจับคู่กับงานพัฒนาปกติ ยิ่งไปกว่านั้นมันยากสำหรับฉันที่จะกลายเป็น "ผู้เชี่ยวชาญ" เพียงพอในวิธีการเหล่านี้ในการสอนคนอื่นในพวกเขาโดยไม่ต้องสละเวลามากเกินไปให้กับพวกเขาคนเดียว จากเทคนิคเหล่านี้ทั้งหมดที่ฉันเห็นว่า "คาดหวัง" ในโลกการพัฒนาซอฟต์แวร์ในปัจจุบันฉันจะรวมพวกเขาเข้ากับทีมในฐานะผู้เล่นใหม่โดยไม่ครอบงำทั้งตัวฉันและทีมได้อย่างไร ฉันจะทำให้ทีมของฉันมีความคล่องตัวมากขึ้นได้อย่างไร มีความเกี่ยวข้อง แต่ฉันไม่ได้เป็นนักพัฒนาแบบ Agile อย่างผู้ถามที่นี่และฉันกำลังดูชุดวิธีการที่กว้างกว่า Agile
106 agile  teamwork 

10
ทำไม Python จึงใช้กับการคำนวณประสิทธิภาพสูง / วิทยาศาสตร์ (แต่ไม่ใช่ Ruby)
มีการอ้างอิงจากการพูดคุย PyCon 2011ที่ไป: อย่างน้อยในร้านค้าของเรา (Argonne National Laboratory) เรามีสามภาษาที่ได้รับการยอมรับสำหรับการคำนวณทางวิทยาศาสตร์ ตามลำดับนี้พวกเขาคือ C / C ++, Fortran ในทุกภาษาและ Python คุณจะสังเกตเห็นว่าการขาด Ruby, Perl, Java มันอยู่ในบริบททั่วไปของการคำนวณประสิทธิภาพสูง การได้รับใบเสนอราคานั้นมาจากร้านค้าเพียงแห่งเดียว แต่มีอีกคำถามเกี่ยวกับภาษาสำหรับ HPCและระบุว่า Python เป็นหนึ่งในการเรียนรู้ (และไม่ใช่ Ruby) ตอนนี้ฉันสามารถเข้าใจ C / C ++ และ Fortran ที่ใช้ในปัญหาพื้นที่ (และ Perl / Java ไม่ได้ใช้) แต่ฉันประหลาดใจที่จะมีความแตกต่างที่สำคัญใน Python และ Ruby ที่ใช้กับ HPC เนื่องจากพวกเขามีความคล้ายคลึงกัน (หมายเหตุ - …

16
ฉันควรชี้ให้เห็นข้อผิดพลาดที่เกี่ยวข้องกับการสะกด / ไวยากรณ์ในรหัสของใครบางคนหรือไม่ [ปิด]
ในขณะที่ตรวจสอบรหัสของเพื่อนร่วมงานฉันพบข้อผิดพลาดการสะกดคำบางอย่างในชื่อฟังก์ชันและข้อผิดพลาดทางไวยากรณ์เช่น 'doesUserHasPermission ()' แทน 'doesUserHavePermission ()' ในชื่อฟังก์ชันและตัวแปร ฉันควรจะชี้สิ่งเหล่านี้ให้เขาหรือฉันเป็นคนหยาบคายเกินไปโดยสังเกตเห็นสิ่งเหล่านี้หรือไม่?

22
การโพสต์งานเกินความต้องการของพวกเขาหรือไม่? [ปิด]
ฉันรู้สึกเหมือนเป็นโปรแกรมเมอร์ที่มีคุณสมบัติเหมาะสม แต่มีการโพสต์งานมากมายที่ทำให้ฉันรู้สึกเป็นอย่างอื่น เกือบทั้งหมดของพวกเขาแยกคุณสมบัติเป็นข้อกำหนดและความต้องการ แต่แม้ส่วนความต้องการสามารถ daunting ฉันเคยเห็นโพสต์มากมายที่บอกว่าพวกเขาต้องการประสบการณ์หลายปี (2 ปีขึ้นไป) ในเทคโนโลยีหรือห้องสมุดที่ค่อนข้างเล็กซึ่งเป็นสิ่งเฉพาะสำหรับ บริษัท ของพวกเขา บางครั้งฉันเห็นประสบการณ์ 5 หรือ 7 ปีที่จำเป็นสำหรับภาษา ด้วยตัวเองสิ่งเหล่านี้จะโอเค แต่มันก็ไร้สาระเมื่อ บริษัท เมืองเล็ก ๆ บอกว่าคุณต้องการ 3 ปีใน 2 ภาษาความสามารถในการเขียนโปรแกรมเครือข่ายสคริปต์ฐานข้อมูลและสิ่งต่าง ๆ เช่น "ประสบการณ์กับระบบที่สำคัญทางธุรกิจที่ซ้ำซ้อนสูง" ทั้งหมดในเวลาเดียวกัน พวกเขาคาดหวังว่าจะพบคนที่มีประสบการณ์ทำงานกับเทคโนโลยีเดียวกันกับที่พวกเขาใช้หรือไม่ ฉันมีปัญหาในการหาโพสต์เดี่ยวที่ฉันไม่มีรูอย่างน้อย 1 หรือ 2 รูในชุดทักษะของฉัน ฉันได้ยินมาหลายครั้งแล้วว่าสถานที่ส่วนใหญ่ให้ความสำคัญกับความสามารถของคุณในการเรียนรู้อย่างรวดเร็วและจะสอนคุณเกี่ยวกับงาน แต่ทำไมต้องบอกว่ามันจำเป็น? พวกเขากำลังพยายามกีดกันที่ก้นถัง (ความล้มเหลวของ FizzBuzz) หรือไม่?
106 skills 

15
เหตุใดโครงสร้างข้อมูลจึงมีความสำคัญในการสัมภาษณ์ [ปิด]
ฉันต้องยอมรับว่าฉันไม่แข็งแรงในโครงสร้างข้อมูลเมื่อฉันจบการศึกษาจากวิทยาลัย ตลอดการฝึกงานในมหาวิทยาลัยในช่วงที่ฉันเรียนจบฉันได้เห็นว่า บริษัท เทคโนโลยียักษ์ใหญ่อย่าง Amazon, Microsoft และอื่น ๆ มุ่งเน้นที่โครงสร้างข้อมูลเป็นหลัก ดูเหมือนว่าโครงสร้างข้อมูลเป็นสิ่งเดียวที่พวกเขาคาดหวังจากบัณฑิต พูดตามตรงฉันรู้สึกไม่ดี ฉันเขียนรหัสที่ดี ฉันทำตามรูปแบบการออกแบบมาตรฐานของการเข้ารหัสฉันใช้โครงสร้างข้อมูล แต่ในระดับผิวเผินใน Java ที่เปิดเผย APIs เช่น ArrayList, LinkedList เป็นต้น แต่ บริษัท มักจะเน้นเรื่องโครงสร้างข้อมูลที่ซับซ้อนเช่นการจัดการหน่วยความจำตามตัวชี้และความซับซ้อนของเวลา อาจเป็นเพราะพื้นหลัง Java ของฉันกลับมาแล้วฉันเข้าใจประสิทธิภาพของโค้ดและตรรกะเฉพาะเมื่อพูดในแง่ของการเขียนโปรแกรมเชิงวัตถุเช่นวัตถุอินสแตนซ์ ฯลฯ แต่ฉันไม่เคยเจาะลงในระดับบิตและไบต์ ฉันไม่ต้องการให้คนดูถูกฉันเพราะการขาดความรู้นี้ในโครงสร้างข้อมูล จริงๆแล้วทำไมทั้งหมดนี้จึงเน้นโครงสร้างข้อมูล?

6
เหตุใด XML จึงเรียกว่า "ภาษา" อย่างแน่นอน
ฉันสงสัยว่าทำไม XML จึงมี L อยู่ในชื่อ ด้วยตัวเอง XML ไม่ "ทำ" อะไร มันเป็นเพียงรูปแบบการจัดเก็บข้อมูลไม่ใช่ภาษา! ภาษาที่ "ทำ" วิธีที่คุณได้รับ XML เพื่อ "ทำ" สิ่งต่าง ๆ เพื่อเปลี่ยนให้เป็นภาษาที่เหมาะสมคือการเพิ่มxmlnsคุณสมบัติให้กับองค์ประกอบราก จากนั้นจะบอกสภาพแวดล้อมเกี่ยวกับสิ่งนั้น ตัวอย่างหนึ่งคือ XHTML มันใช้งานก็มีการเชื่อมโยงหลายมิติรูปแบบอื่น ๆ xmlnsทั้งหมดที่เกิดจาก หากปราศจากไฟล์นั้นไฟล์ XHTML จะเป็นเพียงข้อมูลในโหนดมาร์กอัป เหตุใด XML จึงเรียกว่าภาษา มันไม่ได้อธิบายอะไรเลยมันไม่ได้แปลมันแค่ แก้ไข: บางทีคำถามของฉันควรกว้างขึ้น เนื่องจากคำตอบอยู่ในขณะนี้ "เนื่องจาก XML ถูกตั้งชื่อตาม SGML ซึ่งถูกตั้งชื่อตาม GML ฯลฯ " คำถามควรได้รับทำไมมาร์กอัปภาษา (เช่น XML) เรียกว่าภาษา? อ๋อและ WRT …

5
ใน Java ฉันควรใช้ "final" สำหรับพารามิเตอร์และ locals แม้ว่าฉันไม่จำเป็นต้อง?
Java อนุญาตให้ทำเครื่องหมายตัวแปร (ฟิลด์ / โลแคล / พารามิเตอร์) เป็นfinalเพื่อป้องกันการกำหนดใหม่ ฉันพบว่ามันมีประโยชน์มากกับฟิลด์เนื่องจากมันช่วยให้ฉันดูได้อย่างรวดเร็วว่าคุณลักษณะบางอย่างหรือทั้งคลาสนั้นมีจุดมุ่งหมายที่ไม่เปลี่ยนรูป ในทางกลับกันฉันพบว่ามันมีประโยชน์น้อยกว่ามากกับคนในท้องถิ่นและพารามิเตอร์และฉันมักจะหลีกเลี่ยงการทำเครื่องหมายว่าfinalแม้ว่าพวกเขาจะไม่ได้รับการมอบหมายซ้ำอีกครั้ง (ยกเว้นอย่างชัดเจนเมื่อพวกเขาต้องการใช้ในชั้นเรียน) . อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันใช้รหัสที่ใช้ขั้นสุดท้ายเมื่อใดก็ตามที่ทำได้ซึ่งฉันเดาว่าจะให้ข้อมูลเพิ่มเติมในทางเทคนิค ไม่มั่นใจเกี่ยวกับรูปแบบการเขียนโปรแกรมของฉันอีกต่อไปฉันสงสัยว่าอะไรคือข้อดีและข้อเสียอื่น ๆ ของการใช้finalที่ใดก็ได้ลักษณะอุตสาหกรรมที่พบบ่อยที่สุดคืออะไรและเพราะเหตุใด
105 java  coding-style  final 

12
เหตุใด Square ที่สืบทอดจากสี่เหลี่ยมผืนผ้าจึงมีปัญหาหากเราแทนที่เมธอด SetWidth และ SetHeight
หาก Square เป็นรูปแบบสี่เหลี่ยมผืนผ้ากว่าเหตุใด Square จึงไม่สามารถสืบทอดจากสี่เหลี่ยมผืนผ้าได้ หรือทำไมมันถึงออกแบบไม่ดี? ฉันเคยได้ยินคนพูดว่า: หากคุณกำหนดให้ Square ได้รับมาจากสี่เหลี่ยมผืนผ้าดังนั้น Square ควรใช้งานได้ทุกที่ที่คุณคาดว่าสี่เหลี่ยมผืนผ้า ปัญหาคืออะไรที่นี่? และทำไม Square ถึงใช้งานได้ทุกที่ที่คุณคาดหวังสี่เหลี่ยมผืนผ้า? มันจะใช้งานได้เฉพาะเมื่อเราสร้างวัตถุสแควร์และถ้าเราแทนที่วิธี SetWidth และ SetHeight สำหรับสแควร์กว่าทำไมจะมีปัญหาใด ๆ ? ถ้าคุณมีเมธอด SetWidth และ SetHeight บนคลาสพื้นฐานสี่เหลี่ยมผืนผ้าของคุณและถ้าการอ้างอิงสี่เหลี่ยมผืนผ้าของคุณชี้ไปที่สแควร์แล้ว SetWidth และ SetHeight ไม่สมเหตุสมผลเนื่องจากการตั้งค่าอย่างใดอย่างหนึ่งจะเปลี่ยนอีกเพื่อให้ตรงกับมัน ในกรณีนี้สแควร์ล้มเหลวการทดสอบการทดแทน Liskov ด้วยสี่เหลี่ยมผืนผ้าและนามธรรมของการมีการสืบทอดสแควร์จากสี่เหลี่ยมผืนผ้าเป็นสิ่งที่ไม่ดี บางคนสามารถอธิบายข้อโต้แย้งข้างต้นได้หรือไม่ อีกครั้งถ้าเราใช้วิธี SetWidth และ SetHeight มากเกินไปใน Square มันจะไม่แก้ไขปัญหานี้หรือไม่ ฉันเคยได้ยิน / อ่านด้วย: ปัญหาที่แท้จริงคือเราไม่ได้สร้างโมเดลสี่เหลี่ยมผืนผ้า แต่เป็น "สี่เหลี่ยมที่ปรับเปลี่ยนได้" เช่นสี่เหลี่ยมที่มีความกว้างหรือความสูงสามารถปรับเปลี่ยนได้หลังจากการสร้าง …

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