คำถามติดแท็ก anti-patterns

รูปแบบการต่อต้านเป็นพฤติกรรมหรือการปฏิบัติที่เป็นเรื่องปกติแม้จะไม่มีประสิทธิภาพหรือไม่ได้ผลก็ตาม

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

10
มีชื่อสำหรับรูปแบบ (ต่อต้าน -) ของพารามิเตอร์การส่งผ่านที่จะใช้หลายระดับลึกในสายการโทรหรือไม่
ฉันพยายามหาทางเลือกในการใช้ตัวแปรทั่วโลกในรหัสดั้งเดิม แต่คำถามนี้ไม่เกี่ยวกับทางเลือกทางเทคนิคผมส่วนใหญ่กังวลเกี่ยวกับคำศัพท์ ทางออกที่ชัดเจนคือการส่งผ่านพารามิเตอร์เข้าสู่ฟังก์ชั่นแทนที่จะใช้โกลบอล ใน codebase ดั้งเดิมนี้หมายความว่าฉันต้องเปลี่ยนฟังก์ชั่นทั้งหมดในสายโซ่ยาวระหว่างจุดที่จะใช้ค่าในที่สุดและฟังก์ชั่นที่ได้รับพารามิเตอร์ก่อน higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParamก่อนหน้านี้ซึ่งเคยเป็นตัวแปรทั่วโลกในตัวอย่างของฉัน แต่มันอาจเป็นค่าฮาร์ดโค้ดที่ก่อนหน้านี้แทน ประเด็นก็คือว่าตอนนี้ค่าของ newParam จะได้รับที่higherlevel()และมีการ "เดินทาง" level3()ทุกวิธีการ ฉันสงสัยว่ามีชื่อ (s)สำหรับสถานการณ์ / รูปแบบเช่นนี้ซึ่งคุณต้องเพิ่มพารามิเตอร์ในฟังก์ชั่นมากมายที่เพียงแค่ "ส่ง" ค่าที่ไม่เปลี่ยนแปลง หวังว่าการใช้คำศัพท์ที่เหมาะสมจะช่วยให้ฉันค้นหาทรัพยากรเพิ่มเติมเกี่ยวกับโซลูชันสำหรับการออกแบบใหม่และอธิบายสถานการณ์นี้ให้เพื่อนร่วมงานทราบ

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

9
มีข้อยกเว้นในฐานะโฟลว์คอนโทรลที่ถือว่าเป็น antipattern ที่ร้ายแรง ถ้าเป็นเช่นนั้นทำไม
ย้อนกลับไปในช่วงปลายยุค 90 ฉันทำงานค่อนข้างน้อยด้วยรหัสฐานที่ใช้ข้อยกเว้นเป็นตัวควบคุมการไหล มันใช้เครื่องจักรสถานะ จำกัด เพื่อขับเคลื่อนแอปพลิเคชั่นโทรศัพท์ เมื่อไม่นานมานี้ฉันนึกถึงวันนั้นเพราะฉันทำเว็บแอป MVC พวกเขาทั้งคู่มีControllers ที่ตัดสินใจว่าจะไปที่ไหนต่อไปและให้ข้อมูลกับตรรกะปลายทาง การกระทำของผู้ใช้จากโดเมนของโทรศัพท์เก่าโรงเรียนเช่นโทน DTMF กลายเป็นพารามิเตอร์กับวิธีการดำเนินการ แต่แทนที่จะกลับสิ่งที่ต้องการพวกเขาโยนViewResultStateTransitionException ฉันคิดว่าความแตกต่างที่สำคัญคือวิธีการดำเนินการเป็นvoidหน้าที่ ผมจำไม่ได้ทุกสิ่งที่ฉันทำกับความเป็นจริงนี้ แต่ผมเคยลังเลที่จะได้ไปลงที่ถนนในการจดจำมากเพราะตั้งแต่งานที่เหมือน 15 ปีที่ผ่านมาผมไม่เคยเห็นนี้ในรหัสการผลิตที่งานอื่น ๆ ฉันสันนิษฐานว่านี่เป็นสัญญาณว่าเป็นรูปแบบการต่อต้านที่เรียกว่า เป็นกรณีนี้หรือไม่และถ้าเป็นเช่นนั้นทำไม อัปเดต: เมื่อฉันถามคำถามฉันมีคำตอบในใจของ @ MasonWheeler ดังนั้นฉันจึงไปพร้อมกับคำตอบที่เพิ่มความรู้ให้มากที่สุด ฉันคิดว่าเขาเป็นคำตอบที่ดีเช่นกัน

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

11
antipattern ตรงข้ามกับชื่อของอะไรคือ [ปิด]
Antipattern " Reinvent the wheel " เป็นสิ่งที่พบได้ทั่วไป - แทนที่จะใช้วิธีแก้ปัญหาพร้อมเขียนตัวคุณเองตั้งแต่เริ่มต้น รหัสฐานเติบโตขึ้นโดยไม่จำเป็นอินเทอร์เฟซที่แตกต่างกันเล็กน้อยที่ทำสิ่งเดียวกัน แต่แตกต่างกันเล็กน้อยมากเวลาเสียเวลาในการเขียน (และดีบัก!) ฟังก์ชั่นที่พร้อมใช้งาน เราทุกคนรู้เรื่องนี้ แต่มีบางอย่างที่ปลายด้านตรงข้ามของสเปกตรัม เมื่อแทนที่จะเขียนฟังก์ชั่นของคุณเองซึ่งเป็นโค้ดสองบรรทัดคุณจะต้องนำเข้าเฟรมเวิร์ก / API / ไลบรารี่สร้างอินสแตนซ์กำหนดค่าแปลงบริบทให้เป็นประเภทข้อมูลตามที่เฟรมเวิร์กยอมรับแล้วเรียกว่าหนึ่งฟังก์ชันเดียว ตรรกะทางธุรกิจสองบรรทัดภายใต้กิกะไบต์ของเลเยอร์นามธรรม จากนั้นคุณต้องทำให้ไลบรารีทันสมัยจัดการการพึ่งพาสร้างเก็บลิขสิทธิ์ในซิงค์และรหัสของการเริ่มต้นของมันนานกว่าสิบเท่าและซับซ้อนกว่าถ้าคุณเพิ่ง "reinvented wheel" เหตุผลอาจแตกต่างกันไป: การจัดการต่อต้าน "การคิดค้นใหม่ของวงล้อ" อย่างเคร่งครัดไม่ว่าจะมีค่าใช้จ่ายใครก็ตามที่ผลักดันเทคโนโลยีที่พวกเขาโปรดปรานแม้จะมีความเหลื่อมล้ำกับความต้องการ ใช้งานเฟรมเวิร์กซึ่งไม่เคยมาถึงหรือเพียงแค่เข้าใจผิดว่า "น้ำหนัก" คำแนะนำการนำเข้า / รวม / โหลดสองอย่างที่มี "เบื้องหลัง" มีชื่อสามัญสำหรับ antipattern ประเภทนี้หรือไม่? (ฉันไม่ได้พยายามที่จะเริ่มการสนทนาเมื่อมันถูกหรือผิดหรือถ้ามันเป็นปฏิปักษ์จริงหรือความคิดเห็นอะไรก็ตามนี่เป็นคำถามง่าย ๆ ที่ตรงไปตรงมาและมีวัตถุประสงค์) แก้ไข: ข้อเสนอแนะ "ซ้ำ" พูดถึงการเอารหัสของตนเองมาใช้เพื่อให้ "พร้อมสำหรับทุกอย่าง" นอกเหนือจากระบบภายนอก สิ่งนี้อาจเกิดขึ้นในบางกรณี แต่โดยทั่วไปแล้วมันเกิดจาก …

30
“ ความคิดเห็นเป็นกลิ่นรหัส” [ปิด]
ผู้ร่วมงานของผมเชื่อว่าการใด ๆ ที่ใช้ในการแสดงความคิดเห็นรหัส (เช่นไม่ใช่วิธีการรูปแบบ Javadoc หรือระดับความคิดเห็น) เป็นกลิ่นรหัส คุณคิดอย่างไร?

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

13
การใช้ try-catch ที่ซ้อนกันบล็อกการป้องกันรูปแบบหรือไม่
สิ่งนี้เป็นปฏิปักษ์หรือไม่? มันเป็นวิธีปฏิบัติที่ยอมรับได้? try { //do something } catch (Exception e) { try { //do something in the same line, but being less ambitious } catch (Exception ex) { try { //Do the minimum acceptable } catch (Exception e1) { //More try catches? } } }

14
ชื่อสำหรับ antipattern นี้? ฟิลด์เป็นตัวแปรท้องถิ่น [ปิด]
ในบางรหัสที่ฉันกำลังตรวจสอบอยู่ฉันเห็นสิ่งที่มีค่าเทียบเท่ากับสิ่งต่อไปนี้: public class Foo { private Bar bar; public MethodA() { bar = new Bar(); bar.A(); bar = null; } public MethodB() { bar = new Bar(); bar.B(); bar = null; } } สนามbarที่นี่เป็นเหตุผลตัวแปรท้องถิ่นเช่นค่าของมันจะไม่เคยตั้งใจที่จะยังคงมีอยู่ทั่วโทรวิธี แต่เนื่องจากหลายวิธีในFooความต้องการวัตถุของการพิมพ์Bar, Barผู้เขียนรหัสเดิมได้ทำเพียงแค่ด้านการพิมพ์ เห็นได้ชัดว่ามันไม่ถูกต้องใช่มั้ย antipattern นี้มีชื่อหรือไม่?

6
EAV - มันแย่จริง ๆ ในทุกสถานการณ์หรือไม่?
ฉันคิดว่าจะใช้โมเดลเอนทิตีแอตทริบิวต์ - ค่า (EAV)สำหรับบางสิ่งในโครงการหนึ่ง แต่คำถามทั้งหมดเกี่ยวกับเรื่องนี้ใน Stack Overflowจบลงด้วยคำตอบที่เรียกว่า EAV เป็นรูปแบบการต่อต้าน แต่ฉันสงสัยว่ามันผิดในทุกกรณีหรือไม่ สมมติว่าเอนทิตีผลิตภัณฑ์ของร้านค้ามันมีคุณสมบัติทั่วไปเช่นชื่อคำอธิบายรูปภาพและราคาที่มีส่วนร่วมในหลาย ๆ ตรรกะและมีคุณสมบัติที่เป็นเอกลักษณ์ (กึ่ง) เช่นนาฬิกาและลูกบอลชายหาดจะอธิบายด้วยแง่มุมที่แตกต่างกันโดยสิ้นเชิง ดังนั้นฉันคิดว่า EAV จะเหมาะสำหรับการจัดเก็บคุณลักษณะเฉพาะ (กึ่ง) เหล่านั้น ทั้งหมดนี้เป็นการสมมติว่าสำหรับการแสดงรายการผลิตภัณฑ์มันเป็นข้อมูลที่เพียงพอในตารางผลิตภัณฑ์ (นั่นหมายความว่าไม่มี EAV ที่เกี่ยวข้อง) และเมื่อแสดงผลิตภัณฑ์เดียว / เปรียบเทียบผลิตภัณฑ์สูงสุด 5 รายการ / ฯลฯ ใช้ข้อมูลที่บันทึกโดยใช้ EAV ฉันเคยเห็นวิธีการดังกล่าวในการค้าของวีโอไอพีและค่อนข้างเป็นที่นิยมดังนั้นมีกรณีที่ EAV เหมาะสมหรือไม่

8
การปรับเปลี่ยนพารามิเตอร์ขาเข้าเป็น antipattern หรือไม่? [ปิด]
ฉันกำลังเขียนโปรแกรมใน Java และฉันมักจะทำเช่นนี้: public OtherObject MyObject2OtherObject(MyObject mo){ ... Do the conversion return otherObject; } ในที่ทำงานใหม่รูปแบบคือ: public void MyObject2OtherObject(MyObject mo, OtherObject oo){ ... Do the conversion } สำหรับฉันมันส่งกลิ่นนิดหน่อยเพราะฉันคุ้นเคยกับการไม่เปลี่ยนพารามิเตอร์ขาเข้า การแก้ไขพารามิเตอร์ขาเข้านี้เป็น antipattern หรือไม่ มันมีข้อบกพร่องร้ายแรงบ้างไหม?

8
ORM เป็น Anti-Pattern หรือไม่ [ปิด]
ฉันมีการสนทนาที่กระตุ้นและขัดขวางมากกับเพื่อนร่วมงานเกี่ยวกับ ORM และข้อดีและข้อเสีย ในความคิดของฉัน ORM มีประโยชน์เฉพาะในกรณีที่หายาก อย่างน้อยในประสบการณ์ของฉัน แต่ฉันไม่ต้องการแสดงข้อโต้แย้งของตัวเองในเวลานี้ ดังนั้นฉันถามคุณคุณคิดอย่างไรเกี่ยวกับออม? ข้อดีและข้อเสียคืออะไร?

5
jQuery เป็นตัวอย่างของ antipattern“ พระเจ้าวัตถุ” หรือไม่
ฉันต้องการถาม - ฉันเรียนรู้ช้า jQuery สิ่งที่ฉันเห็นเป็นตัวอย่างที่แน่นอนของพระเจ้าวัตถุต่อต้านรูปแบบ โดยพื้นฐานแล้วทุกอย่างจะเข้าสู่$ฟังก์ชั่นไม่ว่าจะเป็นอะไรก็ตาม ฉันพูดถูกและเป็น jQuery จริง ๆ แล้วเป็นตัวอย่างของรูปแบบการต่อต้านนี้หรือไม่

8
คำศัพท์ (หรือ“ รูปแบบ”) สำหรับ“ ทำอะไรบางอย่างถ้ายังไม่ได้ทำ” [ปิด]
ฟังดูพื้นฐานดีฉันรู้ แต่เมื่อเร็ว ๆ นี้มีเพื่อนร่วมงานคนหนึ่งบอกฉันว่าวิธีการที่เรียกว่าstartHttpServerซับซ้อนเกินไปที่จะเข้าใจเพราะมันเริ่มเซิร์ฟเวอร์เท่านั้นหากยังไม่ได้ทำงาน ฉันพบว่าฉันมีปัญหาเมื่อฉันตอบว่า "จริงจังฉันทำสิ่งนี้มานานหลายสิบปีแล้ว - มันเป็นรูปแบบทั่วไปในการเขียนโปรแกรม" บ่อยครั้งกว่าที่ฉันจะยอมรับว่าเขากลับมาพร้อมกับเอกสารหลักฐานบางอย่างที่แสดงว่าชุมชนการเขียนโปรแกรมทั้งหมดอยู่เบื้องหลังมุมมองของเขาและฉันก็รู้สึกอาย คำถาม : มีรูปแบบการออกแบบที่จัดทำเป็นเอกสารไว้เบื้องหลังแนวคิดของวิธีการที่ไม่ใช้งานหรือไม่หากการกระทำที่ต้องการมีผลบังคับใช้แล้วหรือไม่? หรือถ้าไม่ใช่รูปแบบจะมีชื่อด้วยหรือไม่? และถ้าไม่มีมีเหตุผลใดที่คิดว่ามันซับซ้อนเกินกว่าที่จะพิจารณาการเขียนวิธีในลักษณะนี้?

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