คำถามติดแท็ก separation-of-concerns

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

12
เคยมีเหตุผลในการทำงานของวัตถุทั้งหมดในนวกรรมิกหรือไม่?
ให้ฉันนำหน้าสิ่งนี้โดยบอกว่านี่ไม่ใช่รหัสของฉันหรือรหัสเพื่อนร่วมงานของฉัน หลายปีที่ผ่านมาเมื่อ บริษัท ของเรามีขนาดเล็กลงเรามีโครงการบางอย่างที่เราต้องการทำโดยที่เราไม่มีกำลังการผลิต ตอนนี้ฉันไม่มีอะไรกับผู้รับเหมาช่วงหรือผู้รับเหมาทั่วไป แต่ codebase ที่พวกเขาผลิตนั้นเป็นจำนวนมากของ WTF ที่ถูกกล่าวว่ามันทำงาน (ส่วนใหญ่) ดังนั้นฉันคิดว่ามันอยู่ใน 10 อันดับแรกของโครงการเอาต์ซอร์ซที่ฉันเคยเห็น ในขณะที่ บริษัท ของเราเติบโตขึ้นเราได้พยายามพัฒนาบ้านให้มากขึ้น โปรเจ็กต์นี้ลงบนตักของฉันดังนั้นฉันได้ไปทำความสะอาดเพิ่มการทดสอบ ฯลฯ ฯลฯ มีรูปแบบเดียวที่ฉันเห็นซ้ำหลายครั้งและดูเหมือนว่าน่ากลัวอย่างมากที่ฉันสงสัยว่าอาจจะมีเหตุผลและฉันแค่ไม่เห็นมัน รูปแบบเป็นวัตถุที่ไม่มีวิธีการสาธารณะหรือสมาชิกเพียงแค่ตัวสร้างสาธารณะที่ทำงานของวัตถุทั้งหมด ตัวอย่างเช่น (รหัสอยู่ใน Java หากมีความสำคัญ แต่ฉันหวังว่านี่จะเป็นคำถามทั่วไปมากขึ้น): public class Foo { private int bar; private String baz; public Foo(File f) { execute(f); } private void execute(File f) { // FTP …

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

4
ถ้า MVC เป็น“ การแยกความกังวล” ดังนั้นทำไมจึงมีการแนะนำไวยากรณ์ของมีดโกนไว้
คำถามของฉันเกี่ยวข้องกับรูปแบบการออกแบบ MVC และมีดโกนที่แนะนำโดย Microsoft ในขณะที่การเรียนรู้รูปแบบการออกแบบ MVC ผมก็บอกว่าความคิดที่มีพื้นฐานอยู่บนหลักการที่เรียกว่าการแยกความกังวลเกี่ยวกับ แต่มีดโกน Syntax ช่วยให้เราสามารถใช้ C # ในViewsโดยตรง ข้อกังวลนี้แยกกันหรือเปล่า

8
เมื่อใดที่หนึ่งค่าข้อมูลจริงของฮาร์ดโค้ดในรหัสเมื่อเทียบกับการใช้ฐานข้อมูล
คำถามที่ยืนยาวสำหรับฉันคือ: ฉันจะเก็บข้อมูล (ค่าจริง) ในตารางฐานข้อมูลเมื่อใดและฉันจะเก็บไว้ในรหัสเมื่อใด ฉันทามติที่ยังไม่ได้บอกกล่าวมักจะเป็นเช่นนั้น (*): หากเป็นตัวแปรเดียวหรือโครงสร้างอย่างง่ายหรืออาเรย์ของค่าสองสามค่าให้ใส่ข้อมูลลงในโค้ด [* ฉันทามติได้ถกเถียงกันในความคิดเห็นและคำตอบ แต่โดยทั่วไปฉันต้องการหลักฐานบางอย่างเพื่อเริ่มคำถามดังนั้นอย่าลังเลที่จะท้าทายและพัฒนามัน ] ตัวอย่าง: $number = 44; $colors = array("blue", "yellow", ... "mauve"); หากมีข้อมูลมากกว่าร้อยแถวในประเภทเดียวกันให้ใช้ฐานข้อมูล แต่ดูเหมือนจะมีพื้นที่สีเทา แล้วกรณีไหนที่ไม่ชัดเจน? การพิจารณาและปัจจัยอะไรบ้างที่เราต้องให้ความสนใจในการตัดสินใจ ตัวอย่าง: สมมติว่า บริษัท ของคุณใช้เฟรมมอเตอร์ที่แตกต่างกัน 10-15 ประเภทซึ่งสามารถแสดงเป็น "412T" คุณมีพวกมันประมาณ 30 ตัวและพวกมันเปลี่ยนไม่ค่อย คุณสามารถสร้างตารางฐานข้อมูลสำหรับรหัสเหล่านั้นหรือฮาร์ดโค้ดในฐานข้อมูล ในกรณีนี้มอเตอร์คงที่สิ่งทางกายภาพที่ไม่น่าจะเปลี่ยนบ่อย ทำให้พวกเขาอยู่ในรหัสวิชาที่พวกเขาไปยังแหล่งควบคุมซึ่งในฐานข้อมูลการเปลี่ยนแปลงฐานข้อมูลมักจะไม่ถูกติดตาม แต่เก็บไว้ในฐานข้อมูลปลดปล่อยรหัส (แยก) จากข้อมูล อีกตัวอย่าง (จริง) ที่ฉันสามารถใช้ได้คือคำถามของฉัน: /programming/26169751/how-to-best-get-the-data-out-of-a-lookup-table (ปัจจุบัน 48 แถวของข้อมูลตัวเลือก)

5
การจัดเก็บข้อมูลเมตาในข้อความในโครงสร้างข้อมูลที่ไม่ต่อเนื่อง
ฉันกำลังพัฒนาโปรแกรมที่จะต้องมีการจัดเก็บแบบอินไลน์ , intextเมตาดาต้า สิ่งที่ฉันหมายถึงคือสิ่งต่อไปนี้สมมติว่าเรามีข้อความยาวและเราต้องการเก็บข้อมูลเมตาบางส่วนที่เชื่อมต่อกับคำเฉพาะหรือประโยคของข้อความ อะไรจะเป็นวิธีที่ดีที่สุดในการจัดเก็บข้อมูลนี้ ความคิดแรกของฉันคือการรวมไว้ในข้อความMarkdownไวยากรณ์บางอย่างที่จะถูกแยกวิเคราะห์ในการดึง บางสิ่งที่มีลักษณะเช่นนี้: Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam __nonummy nibh__[@note this sounds really funny latin] euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. นี่จะแนะนำปัญหาสองประการที่ฉันสามารถนึกได้: สิ่งหนึ่งที่ค่อนข้างเล็กคือถ้าไวยากรณ์ดังกล่าวเกิดขึ้นโดยบังเอิญในข้อความดังกล่าวมันสามารถยุ่งกับการแยกวิเคราะห์ สิ่งที่สำคัญที่สุดคือสิ่งนี้จะไม่เก็บข้อมูลเมตานี้แยกจากข้อความ ฉันต้องการให้มีโครงสร้างข้อมูลแบบแยกเพื่อเก็บข้อมูลนี้เช่นตารางฐานข้อมูลที่แตกต่างกันซึ่งข้อมูลเมตาเหล่านี้ถูกเก็บไว้เพื่อให้ฉันสามารถใช้พวกเขาในรูปแบบที่ไม่ต่อเนื่อง: การสืบค้นสถิติการเรียงลำดับและอื่น ๆ แก้ไข:เนื่องจากผู้ตอบลบคำตอบของเขาฉันคิดว่ามันอาจเป็นการดีที่จะเพิ่มข้อเสนอแนะของเขาที่นี่เนื่องจากเป็นข้อเสนอแนะที่ใช้การได้ซึ่งขยายได้ในแนวคิดแรกนี้ โปสเตอร์แนะนำให้ใช้ไวยากรณ์ที่คล้ายกัน แต่จะเชื่อมโยงข้อมูลเมตาไปPRIMARY KEYของmetadataตารางฐานข้อมูล สิ่งที่มีลักษณะเช่นนี้: Lorem ipsum dolor sit amet, consectetuer …

8
เป็นไปได้หรือไม่ที่จะเก็บรหัสการบันทึกไว้อย่างสมบูรณ์นอกตรรกะทางธุรกิจ
ด้วยความช่วยเหลือของ AOP ฉันสามารถลบรหัสบันทึกจากตรรกะทางธุรกิจของฉัน แต่ฉันคิดว่ามันสามารถใช้เพื่อบันทึกสิ่งที่เรียบง่ายเท่านั้น (เช่นการเข้า / ออกวิธีการและค่าพารามิเตอร์) อย่างไรก็ตามถ้าฉันต้องลงชื่อเข้าใช้บางอย่างในตรรกะทางธุรกิจของฉัน เช่น public void SomeDomainMethod(string id) { //Get user by Id User user = Users.Get(id); if (user == null) { Log.Warn("user is not existed"); //<----------------- Log A throw new InvalidOperationException("user is not existed"); } //Step 1 while(true) { //do something } Log.Info("Step 1 …

3
สถาปัตยกรรมที่พูดแล้ว abstraction layer ของฐานข้อมูลเช่น Entity Framework ของ Microsoft ทำให้ความต้องการ Data Access Layer แยกจากกันหรือไม่?
วิธีที่มันเป็น เป็นเวลาหลายปีที่ฉันจัดระเบียบโซลูชันซอฟต์แวร์ของฉันเช่น: Data Access Layer (DAL) เป็นนามธรรมธุรกิจของการเข้าถึงข้อมูล Business Logic Layer (BLL) เพื่อใช้กฎธุรกิจกับชุดข้อมูลจัดการการตรวจสอบความถูกต้อง ฯลฯ Utilities (Util) ซึ่งเป็นเพียงไลบรารีของวิธีการใช้งานทั่วไปที่ฉันสร้างขึ้นเมื่อเวลาผ่านไป Presentation Layer ซึ่งแน่นอนว่าอาจเป็นเว็บเดสก์ท็อปมือถือหรืออะไรก็ตาม วิธีที่มันเป็นตอนนี้ สำหรับสี่ปีที่ผ่านมาหรือดังนั้นฉันใช้ Entity Framework ของ Microsoft (ฉันมีอำนาจเหนือกว่า. dev dev) และฉันพบว่าการมี DAL กลายเป็นเรื่องยุ่งยากมากกว่าการทำความสะอาดเพราะบัญชี Entity Framework ได้ทำไปแล้ว งานที่ DAL ของฉันเคยทำ: มันสรุปธุรกิจของการรัน CRUDs กับฐานข้อมูล ดังนั้นฉันมักจะจบลงด้วย DAL ที่มีคอลเลกชันของวิธีการเช่นนี้: public static IQueryable<SomeObject> GetObjects(){ var db = …

6
Dijkstra ตั้งใจที่จะทำโค้ดให้เป็นมาตรฐานหรือไม่เมื่อเขาเขียนเกี่ยวกับการแยกข้อกังวล?
ก่อนอื่นฉันอ่านข้อความที่ตัดตอนมาของ Edsger W. Dijkstra ในปี 1974 "ในบทบาทของความคิดทางวิทยาศาสตร์": ให้ฉันพยายามอธิบายให้คุณฟังว่าอะไรคือรสนิยมของฉันสำหรับการคิดที่ชาญฉลาด มันคือว่าเราเต็มใจที่จะศึกษาในเชิงลึกในแง่มุมของเนื้อหาที่แยกออกมาเพื่อความมั่นคงของตัวเองตลอดเวลาที่รู้ว่าคนนั้นครอบครองตัวเองด้วยแง่มุมใดด้านหนึ่งเท่านั้น เรารู้ว่าโปรแกรมจะต้องถูกต้องและเราสามารถศึกษาได้จากมุมมองนั้นเท่านั้น เรารู้ด้วยว่ามันควรจะมีประสิทธิภาพและเราสามารถศึกษาประสิทธิภาพของมันในอีกวันหนึ่ง ในอีกอารมณ์หนึ่งเราอาจถามตัวเองว่าและถ้าเป็นเช่นนั้น: ทำไมโปรแกรมนี้จึงเป็นที่ต้องการ แต่ไม่มีสิ่งใดได้รับ - ในทางตรงกันข้าม! - โดยจัดการกับแง่มุมต่าง ๆ เหล่านี้พร้อมกัน บางครั้งฉันก็เรียกว่า "การแยกความกังวล" ซึ่งแม้ว่าจะเป็นไปไม่ได้อย่างสมบูรณ์ก็ตาม ยังเป็นเทคนิคเดียวที่มีอยู่สำหรับการจัดลำดับความคิดของคน ๆ หนึ่งที่ฉันรู้ นี่คือสิ่งที่ฉันหมายถึงโดย "การมุ่งความสนใจไปที่บางแง่มุม": มันไม่ได้หมายถึงการเพิกเฉยต่อแง่มุมอื่น ๆ มันแค่ทำความยุติธรรมกับข้อเท็จจริงที่ว่าจากมุมมองของแง่มุมนี้มุมมองอื่น ๆ นั้นไม่เกี่ยวข้อง มันเป็นหนึ่งในใจและหลายแทร็คพร้อมกัน ฉันเห็นการแยกข้อกังวลที่ทันสมัยพูดคุยเกี่ยวกับการทำให้โค้ดของคุณเป็นโมดูล อย่างไรก็ตามการอ่านคำพูดข้างต้นฉันเข้าใจว่านี่คือการมุ่งความคิดของคุณไปที่งานหนึ่งโดยเฉพาะในขณะที่ไม่ได้มุ่งเน้นด้านอื่น ๆ นี่ไม่ได้แปลว่าจำเป็นต้องแบ่งรหัสออกเป็นส่วนย่อย ๆ กล่าวคือมีโค้ดอยู่ข้างหน้าคุณว่าในไฟล์เดียวมีแนวคิดของมุมมองพื้นที่เก็บข้อมูลตัวควบคุมการจัดการเหตุการณ์โรงงาน ฯลฯ ทั้งหมดในไฟล์เดียว สำหรับตัวอย่างสั้น ๆ นี่คือโค้ดบางส่วนที่มีการเข้าถึงข้อมูลและมุมมอง (เอาต์พุต): $sql = "SELECT * …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.