คำถามติดแท็ก encapsulation

6
วิธีการผูกมัดกับการห่อหุ้ม
มีปัญหา OOP แบบคลาสสิกของวิธีการผูกมัด vs วิธีการ "จุดเชื่อมต่อจุดเดียว": main.getA().getB().getC().transmogrify(x, y) VS main.getA().transmogrifyMyC(x, y) ครั้งแรกที่ดูเหมือนว่าจะมีข้อได้เปรียบที่แต่ละชั้นมีความรับผิดชอบสำหรับชุดปฏิบัติการขนาดเล็กเท่านั้นและทำให้ทุกอย่างเป็นแบบแยกส่วนมากขึ้น- การเพิ่มวิธีการใน C ไม่ต้องใช้ความพยายามใน A, B หรือ C เพื่อเปิดเผย ข้อเสียของหลักสูตรคือการห่อหุ้มที่อ่อนแอซึ่งรหัสที่สองแก้ ตอนนี้ A มีการควบคุมทุกวิธีที่ผ่านมันและสามารถมอบมันให้กับเขตข้อมูลของมันถ้ามันต้องการ ฉันรู้ว่าไม่มีวิธีแก้ปัญหาเดียวและแน่นอนขึ้นอยู่กับบริบท แต่ฉันอยากได้ยินบางอย่างเกี่ยวกับความแตกต่างที่สำคัญระหว่างสไตล์สองแบบและภายใต้สถานการณ์ใดที่ฉันควรเลือกแบบใดแบบหนึ่ง - เพราะตอนนี้เมื่อฉันลอง เพื่อออกแบบรหัสฉันรู้สึกว่าฉันไม่ได้ใช้อาร์กิวเมนต์เพื่อตัดสินใจทางเดียวหรืออื่น ๆ

5
ฉันสามารถใช้ Dependency Injection โดยไม่ทำลาย Encapsulation ได้ไหม
นี่คือโซลูชันและโครงการของฉัน: ร้านหนังสือ (โซลูชัน) BookStore.Coupler (โครงการ) Bootstrapper.cs BookStore.Domain (โครงการ) CreateBookCommandValidator.cs CompositeValidator.cs IValidate.cs IValidator.cs ICommandHandler.cs BookStore.Infrastructure (โครงการ) CreateBookCommandHandler.cs ValidationCommandHandlerDecorator.cs BookStore.Web (โครงการ) Global.asax BookStore.BatchProcesses (โครงการ) Program.cs Bootstrapper.cs : public static class Bootstrapper.cs { // I'm using SimpleInjector as my DI Container public static void Initialize(Container container) { container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>), typeof(CreateBookCommandHandler).Assembly); container.RegisterDecorator(typeof(ICommandHandler<>), typeof(ValidationCommandHandlerDecorator<>)); container.RegisterManyForOpenGeneric(typeof(IValidate<>), AccessibilityOption.PublicTypesOnly, …

7
เป็นความคิดที่ไม่ดีหรือไม่ที่ทำให้วิธีการเรียนที่ผ่านการเรียนตัวแปรหรือไม่
นี่คือสิ่งที่ฉันหมายถึง: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } addสามารถเข้าถึงตัวแปรทั้งหมดที่ต้องการได้แล้วเนื่องจากเป็นวิธีการเรียนดังนั้นนี่เป็นความคิดที่ไม่ดีหรือไม่? …

1
ใช้คลาสเพื่อนเพื่อแค็ปซูลฟังก์ชั่นสมาชิกส่วนตัวใน C ++ - การปฏิบัติที่ดีหรือการละเมิด?
ดังนั้นฉันสังเกตเห็นว่าเป็นไปได้ที่จะหลีกเลี่ยงการใส่ฟังก์ชั่นส่วนตัวไว้ในส่วนหัวโดยทำสิ่งนี้: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } ฟังก์ชั่นส่วนตัวไม่เคยประกาศในส่วนหัวและผู้บริโภคของชั้นเรียนที่นำเข้าส่วนหัวไม่จำเป็นต้องรู้ว่ามันมีอยู่ นี่เป็นสิ่งจำเป็นหากฟังก์ชันตัวช่วยเป็นเทมเพลต (ทางเลือกคือใส่รหัสเต็มในส่วนหัว) ซึ่งเป็นวิธีที่ฉัน "ค้นพบ" สิ่งนี้ …

3
แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้สาธารณะการป้องกันส่วนตัวหรือไม่
มันยุติธรรมที่จะบอกว่ามันเป็นวิธีที่ดีในการเริ่มต้นทุกอย่างให้privateล่วงหน้าเมื่อเขียนโค้ดบางอย่าง? จากนั้นอัปเกรดprotectedเป็นคลาสย่อยเท่านั้นpublicหากต้องการคลาสอื่นหรือไม่

5
ฉันควรแค็ปซูลโครงสร้างข้อมูลภายในทั้งหมดหรือไม่
โปรดพิจารณาคลาสนี้: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThings(){ return things; } } คลาสนี้จะเปิดเผยอาร์เรย์ที่ใช้ในการจัดเก็บข้อมูลรหัสลูกค้าใด ๆ ที่สนใจ ฉันทำสิ่งนี้ในแอปที่ฉันทำงานอยู่ ฉันมีChordProgressionคลาสที่เก็บลำดับของChords (และทำสิ่งอื่น) มันมีChord[] getChords()วิธีที่คืนค่าอาร์เรย์ของคอร์ด เมื่อโครงสร้างข้อมูลต้องเปลี่ยน (จากอาร์เรย์เป็น ArrayList) รหัสไคลเอ็นต์ทั้งหมดจะพัง นี่ทำให้ฉันคิดว่า - วิธีต่อไปนี้อาจจะดีกว่า: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThing(int index){ return …

4
ฉันต้องทนทุกข์ทรมานจากการห่อหุ้มมากเกินไป?
ฉันสังเกตเห็นบางอย่างในรหัสของฉันในโครงการต่าง ๆ ที่ดูเหมือนว่ากลิ่นรหัสให้ฉันและสิ่งที่ไม่ดีที่จะทำ แต่ฉันไม่สามารถจัดการกับมัน ในขณะที่พยายามเขียน "รหัสสะอาด" ฉันมักจะใช้วิธีส่วนตัวมากเกินไปเพื่อให้อ่านรหัสได้ง่ายขึ้น ปัญหาคือรหัสนั้นสะอาดกว่า แต่ก็ยากกว่าในการทดสอบ (ใช่ฉันรู้ว่าฉันสามารถทดสอบวิธีการส่วนตัว ... ) และโดยทั่วไปดูเหมือนว่านิสัยที่ไม่ดีสำหรับฉัน นี่คือตัวอย่างของคลาสที่อ่านข้อมูลบางอย่างจากไฟล์. csv และส่งคืนกลุ่มลูกค้า (วัตถุอื่นที่มีเขตข้อมูลและแอตทริบิวต์ต่าง ๆ ) public class GroupOfCustomersImporter { //... Call fields .... public GroupOfCustomersImporter(String filePath) { this.filePath = filePath; customers = new HashSet<Customer>(); createCSVReader(); read(); constructTTRP_Instance(); } private void createCSVReader() { //.... } private void …

4
คลาสที่ซ้อนกัน: เครื่องมือที่มีประโยชน์หรือการละเมิดการห่อหุ้มข้อมูลหรือไม่
ดังนั้นฉันยังอยู่บนรั้วว่าควรใช้สิ่งเหล่านี้หรือไม่ ฉันรู้สึกว่ามันเป็นการละเมิด encapsulation อย่างมาก แต่ฉันพบว่าฉันสามารถบรรลุระดับการห่อหุ้มได้ในขณะที่เพิ่มความยืดหยุ่นในโค้ดของฉัน โปรเจ็กต์ Java / Swing ก่อนหน้านี้ฉันใช้คลาสที่ซ้อนกันในระดับหนึ่ง แต่ตอนนี้ฉันได้ย้ายไปยังโปรเจ็กต์อื่นใน C # และฉันหลีกเลี่ยงการใช้งาน คุณรู้สึกอย่างไรเกี่ยวกับคลาสที่ซ้อนกัน?

4
การเปลี่ยนชื่อวิธีรักษาการห่อหุ้มได้หรือไม่?
ฉันกำลังอ่านหน้านี้เกี่ยวกับเมื่อ getters / setters เป็นธรรมและ OP ให้ตัวอย่างรหัสต่อไปนี้: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void go_shopping(Fridge fridge) { fridge.set_cheese(fridge.get_cheese() + 5); } ยอมรับคำตอบรัฐ: โดยวิธีการในตัวอย่างของคุณ, ฉันจะให้ชั้นและวิธีการแทนและ จากนั้นคุณจะยังคงมีการห่อหุ้มFridgeputCheese()takeCheese()get_cheese()set_cheese() การห่อหุ้มนั้นถูกเก็บรักษาไว้อย่างไรโดยการเปลี่ยนชื่อจากรับ / ตั้งค่าเป็นputCheese()/ takeCheese()คุณเห็นได้ชัดว่าได้รับ / ตั้งค่าดังนั้นทำไมไม่ปล่อยไว้เป็นรับ / ตั้งค่า? ในคำตอบเดียวกันมันยังระบุ: มี getters …

5
จะทำให้มันชัดเจนได้อย่างไรว่าฟังก์ชั่นนั้นถูกเข้าถึงจากภายนอก?
นี่เป็นคำถามเฉพาะ C ฉันพยายามทำให้ทุกอย่างเป็นไปได้ภายในขอบเขตหน่วยการแปลโดยแสดงฟังก์ชั่นบางอย่างผ่าน.hไฟล์ นั่นคือฉันกำลังstaticเชื่อมโยงกับวัตถุระดับไฟล์ ตอนนี้ฟังก์ชั่นสองอย่างจำเป็นต้องมีการเรียกใช้โดยโมดูลอื่น แต่ไม่ใช่โดยตรง โมดูล / ไฟล์ / หน่วยการแปลของฉันสมัครสมาชิกกับโมดูลอื่นผ่านตัวชี้ไปยังฟังก์ชัน จากนั้นเมื่อมีเหตุการณ์ที่เฉพาะเจาะจงตัวชี้จะถูกเรียกด้วยอาร์กิวเมนต์บางตัว ดังนั้นฉันสงสัยว่าจะทำให้มันชัดเจนมากว่าฟังก์ชั่นเหล่านั้นถูกเรียกจากสถานที่คลุมเครือ พวกเขาควรจะเป็นstaticหรือextern(และเปิดเผยพวกเขาใน.h)? ฉันควรจะใส่คำใบ้ไว้ในชื่อของฟังก์ชั่นหรือไม่? หรือมันเพียงพอที่จะใส่ความคิดเห็น "เรียกโดย X"?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.