[{"data":1,"prerenderedAt":1736},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-ngan-hang-cau-hoi-oop":420,"-phong-van-ngan-hang-cau-hoi-oop-surround":1731},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":1724,"extension":1725,"links":1726,"meta":1727,"navigation":1728,"path":79,"seo":1729,"stem":80,"__hash__":1730},"docs\u002F1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop.md","Ngân hàng câu hỏi OOP và SOLID",{"type":424,"value":425,"toc":1666},"minimark",[426,431,436,440,469,473,476,530,541,545,574,578,592,596,599,620,624,631,635,650,654,674,678,697,701,705,777,781,814,818,828,832,835,839,863,866,870,880,884,888,926,930,946,950,970,974,984,988,992,995,1027,1031,1034,1091,1095,1098,1123,1127,1142,1152,1156,1197,1201,1204,1247,1251,1255,1271,1275,1281,1285,1289,1292,1312,1316,1345,1351,1355,1358,1397,1401,1408,1412,1455,1458,1462,1469,1473,1489,1493,1503,1507,1514,1523,1531,1541,1545,1552,1556,1576,1580,1603,1607,1627,1631,1634,1652,1655,1662],[427,428,430],"h2",{"id":429},"a-4-tính-chất-oop","A. 4 tính chất OOP",[432,433,435],"h3",{"id":434},"_1-oop-là-gì-4-tính-chất-gồm-những-gì","1. OOP là gì? 4 tính chất gồm những gì?",[437,438,439],"p",{},"Object-Oriented Programming — mô hình hoá thế giới thực bằng object. 4 tính chất:",[441,442,443,451,457,463],"ol",{},[444,445,446,450],"li",{},[447,448,449],"strong",{},"Encapsulation"," (đóng gói)",[444,452,453,456],{},[447,454,455],{},"Abstraction"," (trừu tượng)",[444,458,459,462],{},[447,460,461],{},"Inheritance"," (kế thừa)",[444,464,465,468],{},[447,466,467],{},"Polymorphism"," (đa hình)",[432,470,472],{"id":471},"_2-encapsulation-là-gì-ví-dụ","2. Encapsulation là gì? Ví dụ?",[437,474,475],{},"Che giấu state, expose qua method\u002Fproperty:",[477,478,483],"pre",{"className":479,"code":480,"language":481,"meta":482,"style":482},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public class BankAccount {\n    private decimal _balance;\n    public decimal Balance => _balance;\n    public void Deposit(decimal amt) {\n        if (amt > 0) _balance += amt;\n    }\n}\n","csharp","",[484,485,486,494,500,506,512,518,524],"code",{"__ignoreMap":482},[487,488,491],"span",{"class":489,"line":490},"line",1,[487,492,493],{},"public class BankAccount {\n",[487,495,497],{"class":489,"line":496},2,[487,498,499],{},"    private decimal _balance;\n",[487,501,503],{"class":489,"line":502},3,[487,504,505],{},"    public decimal Balance => _balance;\n",[487,507,509],{"class":489,"line":508},4,[487,510,511],{},"    public void Deposit(decimal amt) {\n",[487,513,515],{"class":489,"line":514},5,[487,516,517],{},"        if (amt > 0) _balance += amt;\n",[487,519,521],{"class":489,"line":520},6,[487,522,523],{},"    }\n",[487,525,527],{"class":489,"line":526},7,[487,528,529],{},"}\n",[437,531,532,533,536,537,540],{},"Bên ngoài không thay đổi ",[484,534,535],{},"_balance"," trực tiếp — phải qua ",[484,538,539],{},"Deposit"," có validation.",[432,542,544],{"id":543},"_3-abstraction-khác-encapsulation-chỗ-nào","3. Abstraction khác Encapsulation chỗ nào?",[546,547,548,558],"ul",{},[444,549,550,552,553,557],{},[447,551,455],{},": ẩn ",[554,555,556],"em",{},"độ phức tạp"," — chỉ expose interface cần thiết (concept).",[444,559,560,552,562,565,566,569,570,573],{},[447,561,449],{},[554,563,564],{},"dữ liệu nội bộ"," — thực thi qua access modifier (mechanism).\nHai khái niệm liên quan nhưng khác cấp độ: abstraction là ",[447,567,568],{},"what",", encapsulation là ",[447,571,572],{},"how",".",[432,575,577],{"id":576},"_4-kế-thừa-quan-hệ-is-a-hay-has-a","4. Kế thừa — Quan hệ \"is-a\" hay \"has-a\"?",[437,579,580,583,584,587,588,591],{},[447,581,582],{},"Is-a."," ",[484,585,586],{},"Dog : Animal"," — Dog IS-A Animal. Nếu chỉ \"có\" (Car có Engine) → dùng ",[447,589,590],{},"composition"," (has-a).",[432,593,595],{"id":594},"_5-polymorphism-có-mấy-loại","5. Polymorphism có mấy loại?",[437,597,598],{},"2 loại:",[546,600,601,607],{},[444,602,603,606],{},[447,604,605],{},"Compile-time"," (static): method overload, operator overload.",[444,608,609,612,613,616,617,573],{},[447,610,611],{},"Runtime"," (dynamic): method override qua ",[484,614,615],{},"virtual","\u002F",[484,618,619],{},"override",[432,621,623],{"id":622},"_6-đa-hình-runtime-hoạt-động-ra-sao","6. Đa hình runtime hoạt động ra sao?",[437,625,626,627,630],{},"CLR dùng ",[447,628,629],{},"virtual method table (vtable)",". Khi gọi method virtual, runtime tra vtable của object thực tế → gọi đúng method override.",[432,632,634],{"id":633},"_7-cho-ví-dụ-về-polymorphism-với-reference-type-cha","7. Cho ví dụ về Polymorphism với reference type cha?",[477,636,638],{"className":479,"code":637,"language":481,"meta":482,"style":482},"Animal a = new Dog();\na.Speak();   \u002F\u002F Gọi Dog.Speak() vì Speak là virtual và Dog override\n",[484,639,640,645],{"__ignoreMap":482},[487,641,642],{"class":489,"line":490},[487,643,644],{},"Animal a = new Dog();\n",[487,646,647],{"class":489,"line":496},[487,648,649],{},"a.Speak();   \u002F\u002F Gọi Dog.Speak() vì Speak là virtual và Dog override\n",[432,651,653],{"id":652},"_8-inheritance-có-nhược-điểm-gì","8. Inheritance có nhược điểm gì?",[546,655,656,662,665,668],{},[444,657,658,661],{},[447,659,660],{},"Coupling"," chặt: con phụ thuộc cấu trúc cha. Cha đổi → con vỡ.",[444,663,664],{},"Lạm dụng tạo cây kế thừa sâu khó maintain.",[444,666,667],{},"Vi phạm LSP dễ xảy ra (Square : Rectangle).",[444,669,670,671,573],{},"→ Khuyến nghị: ",[447,672,673],{},"Composition over Inheritance",[432,675,677],{"id":676},"_9-composition-over-inheritance-ý-nghĩa","9. Composition over Inheritance — ý nghĩa?",[437,679,680,681,684,685,688,689,692,693,696],{},"Thay vì ",[484,682,683],{},"Car : Vehicle",", dùng ",[484,686,687],{},"Car"," chứa ",[484,690,691],{},"Engine",", ",[484,694,695],{},"Wheels"," (interface). Linh hoạt hơn — đổi engine không sửa Car.",[427,698,700],{"id":699},"b-interface-abstract-class","B. Interface & Abstract class",[432,702,704],{"id":703},"_10-interface-vs-abstract-class-khác-nhau-cơ-bản","10. Interface vs Abstract class — khác nhau cơ bản?",[706,707,708,723],"table",{},[709,710,711],"thead",{},[712,713,714,717,720],"tr",{},[715,716],"th",{},[715,718,719],{},"Interface",[715,721,722],{},"Abstract class",[724,725,726,738,747,756,766],"tbody",{},[712,727,728,732,735],{},[729,730,731],"td",{},"Multiple inheritance",[729,733,734],{},"✅",[729,736,737],{},"❌",[712,739,740,743,745],{},[729,741,742],{},"Field\u002Fstate",[729,744,737],{},[729,746,734],{},[712,748,749,752,754],{},[729,750,751],{},"Constructor",[729,753,737],{},[729,755,734],{},[712,757,758,761,764],{},[729,759,760],{},"Method body",[729,762,763],{},"❌ (đến C# 8 có default)",[729,765,734],{},[712,767,768,771,774],{},[729,769,770],{},"Mục đích",[729,772,773],{},"Capability",[729,775,776],{},"Bản chất",[432,778,780],{"id":779},"_11-khi-nào-dùng-interface-khi-nào-dùng-abstract-class","11. Khi nào dùng Interface, khi nào dùng Abstract class?",[546,782,783,792,802,807],{},[444,784,785,786,788,789,573],{},"Cần share ",[447,787,484],{}," (method body, field) → ",[484,790,791],{},"abstract class",[444,793,794,795,798,799,573],{},"Chỉ cần share ",[447,796,797],{},"hợp đồng"," → ",[484,800,801],{},"interface",[444,803,804,805,573],{},"Cần multiple inheritance → ",[484,806,801],{},[444,808,809,810,813],{},"Trong .NET hiện đại, ",[447,811,812],{},"mặc định nghiêng về interface"," vì dễ test\u002Fmock.",[432,815,817],{"id":816},"_12-class-có-thể-vừa-kế-thừa-class-vừa-implement-interface-không","12. Class có thể vừa kế thừa class vừa implement interface không?",[437,819,820,823,824,827],{},[447,821,822],{},"Có."," Cú pháp: ",[484,825,826],{},"class A : BaseClass, IInterface1, IInterface2",". Class cha phải đứng trước.",[432,829,831],{"id":830},"_13-default-interface-method-c-8","13. Default interface method (C# 8+)?",[437,833,834],{},"Interface có thể có method có body làm mặc định. Class implement không bắt buộc override. Hữu ích để thêm method mới không break code cũ.",[432,836,838],{"id":837},"_14-explicit-interface-implementation","14. Explicit interface implementation?",[477,840,842],{"className":479,"code":841,"language":481,"meta":482,"style":482},"public class Logger : IConsoleLog, IFileLog {\n    void IConsoleLog.Log(string m) { \u002F*...*\u002F }\n    void IFileLog.Log(string m)    { \u002F*...*\u002F }\n}\n",[484,843,844,849,854,859],{"__ignoreMap":482},[487,845,846],{"class":489,"line":490},[487,847,848],{},"public class Logger : IConsoleLog, IFileLog {\n",[487,850,851],{"class":489,"line":496},[487,852,853],{},"    void IConsoleLog.Log(string m) { \u002F*...*\u002F }\n",[487,855,856],{"class":489,"line":502},[487,857,858],{},"    void IFileLog.Log(string m)    { \u002F*...*\u002F }\n",[487,860,861],{"class":489,"line":508},[487,862,529],{},[437,864,865],{},"Dùng khi 2 interface có method trùng tên cần implementation khác nhau.",[432,867,869],{"id":868},"_15-có-thể-tạo-instance-của-abstract-class-không","15. Có thể tạo instance của abstract class không?",[437,871,872,875,876,879],{},[447,873,874],{},"Không."," Abstract class chỉ dùng làm base, phải kế thừa và implement abstract member rồi mới ",[484,877,878],{},"new"," được class con.",[427,881,883],{"id":882},"c-access-modifier-member","C. Access modifier & member",[432,885,887],{"id":886},"_16-5-access-modifier-của-c","16. 5 access modifier của C#?",[546,889,890,896,902,908,914,920],{},[444,891,892,895],{},[484,893,894],{},"public"," — mọi nơi.",[444,897,898,901],{},[484,899,900],{},"private"," — chỉ trong class.",[444,903,904,907],{},[484,905,906],{},"protected"," — trong class và class con.",[444,909,910,913],{},[484,911,912],{},"internal"," — trong cùng assembly.",[444,915,916,919],{},[484,917,918],{},"protected internal"," — class con HOẶC cùng assembly.",[444,921,922,925],{},[484,923,924],{},"private protected"," — class con TRONG cùng assembly.",[432,927,929],{"id":928},"_17-property-vs-field-khác-gì","17. Property vs Field — khác gì?",[546,931,932,940],{},[444,933,934,937,938,573],{},[447,935,936],{},"Field",": biến lưu data, thường ",[484,939,900],{},[444,941,942,945],{},[447,943,944],{},"Property",": pair get\u002Fset wrap field — cho phép validation, computed, encapsulation. Truy cập như field nhưng thực chất gọi method.",[432,947,949],{"id":948},"_18-auto-property-là-gì","18. Auto-property là gì?",[477,951,953],{"className":479,"code":952,"language":481,"meta":482,"style":482},"public string Name { get; set; }   \u002F\u002F compiler tự sinh backing field\npublic string Name { get; init; }  \u002F\u002F chỉ set khi init\npublic string Name { get; private set; }  \u002F\u002F set chỉ trong class\n",[484,954,955,960,965],{"__ignoreMap":482},[487,956,957],{"class":489,"line":490},[487,958,959],{},"public string Name { get; set; }   \u002F\u002F compiler tự sinh backing field\n",[487,961,962],{"class":489,"line":496},[487,963,964],{},"public string Name { get; init; }  \u002F\u002F chỉ set khi init\n",[487,966,967],{"class":489,"line":502},[487,968,969],{},"public string Name { get; private set; }  \u002F\u002F set chỉ trong class\n",[432,971,973],{"id":972},"_19-static-class-có-thể-có-constructor-không","19. Static class có thể có constructor không?",[437,975,976,979,980,983],{},[447,977,978],{},"Có"," — static constructor ",[484,981,982],{},"static MyClass()"," không tham số, chạy 1 lần khi class được load.",[427,985,987],{"id":986},"d-solid","D. SOLID",[432,989,991],{"id":990},"_20-solid-là-gì","20. SOLID là gì?",[437,993,994],{},"5 nguyên lý OOP của Robert C. Martin:",[546,996,997,1003,1009,1015,1021],{},[444,998,999,1002],{},[447,1000,1001],{},"S"," — Single Responsibility",[444,1004,1005,1008],{},[447,1006,1007],{},"O"," — Open\u002FClosed",[444,1010,1011,1014],{},[447,1012,1013],{},"L"," — Liskov Substitution",[444,1016,1017,1020],{},[447,1018,1019],{},"I"," — Interface Segregation",[444,1022,1023,1026],{},[447,1024,1025],{},"D"," — Dependency Inversion",[432,1028,1030],{"id":1029},"_21-single-responsibility-principle-ví-dụ","21. Single Responsibility Principle — ví dụ?",[437,1032,1033],{},"Một class chỉ một lý do để đổi.",[477,1035,1037],{"className":479,"code":1036,"language":481,"meta":482,"style":482},"\u002F\u002F ❌ Class này có 3 lý do đổi\nclass Report {\n    void Generate() {}\n    void SaveToDb() {}\n    void EmailToUser() {}\n}\n\u002F\u002F ✅ Tách 3 class\nclass Report {}\nclass ReportRepository {}\nclass ReportEmailService {}\n",[484,1038,1039,1044,1049,1054,1059,1064,1068,1073,1079,1085],{"__ignoreMap":482},[487,1040,1041],{"class":489,"line":490},[487,1042,1043],{},"\u002F\u002F ❌ Class này có 3 lý do đổi\n",[487,1045,1046],{"class":489,"line":496},[487,1047,1048],{},"class Report {\n",[487,1050,1051],{"class":489,"line":502},[487,1052,1053],{},"    void Generate() {}\n",[487,1055,1056],{"class":489,"line":508},[487,1057,1058],{},"    void SaveToDb() {}\n",[487,1060,1061],{"class":489,"line":514},[487,1062,1063],{},"    void EmailToUser() {}\n",[487,1065,1066],{"class":489,"line":520},[487,1067,529],{},[487,1069,1070],{"class":489,"line":526},[487,1071,1072],{},"\u002F\u002F ✅ Tách 3 class\n",[487,1074,1076],{"class":489,"line":1075},8,[487,1077,1078],{},"class Report {}\n",[487,1080,1082],{"class":489,"line":1081},9,[487,1083,1084],{},"class ReportRepository {}\n",[487,1086,1088],{"class":489,"line":1087},10,[487,1089,1090],{},"class ReportEmailService {}\n",[432,1092,1094],{"id":1093},"_22-openclosed-principle-ví-dụ","22. Open\u002FClosed Principle — ví dụ?",[437,1096,1097],{},"Mở để mở rộng, đóng để sửa. Thêm shape mới mà không sửa code cũ:",[477,1099,1101],{"className":479,"code":1100,"language":481,"meta":482,"style":482},"abstract class Shape { public abstract double Area(); }\nclass Circle : Shape { public override double Area() => Math.PI * r * r; }\nclass Square : Shape { public override double Area() => s * s; }\n\u002F\u002F Thêm Triangle? Tạo class mới, không sửa class hiện có.\n",[484,1102,1103,1108,1113,1118],{"__ignoreMap":482},[487,1104,1105],{"class":489,"line":490},[487,1106,1107],{},"abstract class Shape { public abstract double Area(); }\n",[487,1109,1110],{"class":489,"line":496},[487,1111,1112],{},"class Circle : Shape { public override double Area() => Math.PI * r * r; }\n",[487,1114,1115],{"class":489,"line":502},[487,1116,1117],{},"class Square : Shape { public override double Area() => s * s; }\n",[487,1119,1120],{"class":489,"line":508},[487,1121,1122],{},"\u002F\u002F Thêm Triangle? Tạo class mới, không sửa class hiện có.\n",[432,1124,1126],{"id":1125},"_23-liskov-substitution-principle-ví-dụ-vi-phạm","23. Liskov Substitution Principle — ví dụ vi phạm?",[477,1128,1130],{"className":479,"code":1129,"language":481,"meta":482,"style":482},"class Bird { public virtual void Fly() {} }\nclass Penguin : Bird { public override void Fly() => throw; }\n",[484,1131,1132,1137],{"__ignoreMap":482},[487,1133,1134],{"class":489,"line":490},[487,1135,1136],{},"class Bird { public virtual void Fly() {} }\n",[487,1138,1139],{"class":489,"line":496},[487,1140,1141],{},"class Penguin : Bird { public override void Fly() => throw; }\n",[437,1143,1144,1145,1148,1149,573],{},"Penguin substituted vào Bird sẽ phá code gọi ",[484,1146,1147],{},"Fly()",". Fix: tách ",[484,1150,1151],{},"IFlyable",[432,1153,1155],{"id":1154},"_24-interface-segregation-principle-ví-dụ","24. Interface Segregation Principle — ví dụ?",[477,1157,1159],{"className":479,"code":1158,"language":481,"meta":482,"style":482},"\u002F\u002F ❌ Fat interface\ninterface IWorker { void Work(); void Eat(); }\nclass Robot : IWorker { ...Eat() => throw; }\n\n\u002F\u002F ✅ Tách\ninterface IWorkable { void Work(); }\ninterface IFeedable { void Eat(); }\n",[484,1160,1161,1166,1171,1176,1182,1187,1192],{"__ignoreMap":482},[487,1162,1163],{"class":489,"line":490},[487,1164,1165],{},"\u002F\u002F ❌ Fat interface\n",[487,1167,1168],{"class":489,"line":496},[487,1169,1170],{},"interface IWorker { void Work(); void Eat(); }\n",[487,1172,1173],{"class":489,"line":502},[487,1174,1175],{},"class Robot : IWorker { ...Eat() => throw; }\n",[487,1177,1178],{"class":489,"line":508},[487,1179,1181],{"emptyLinePlaceholder":1180},true,"\n",[487,1183,1184],{"class":489,"line":514},[487,1185,1186],{},"\u002F\u002F ✅ Tách\n",[487,1188,1189],{"class":489,"line":520},[487,1190,1191],{},"interface IWorkable { void Work(); }\n",[487,1193,1194],{"class":489,"line":526},[487,1195,1196],{},"interface IFeedable { void Eat(); }\n",[432,1198,1200],{"id":1199},"_25-dependency-inversion-principle-ví-dụ","25. Dependency Inversion Principle — ví dụ?",[437,1202,1203],{},"Module cấp cao không depend module cấp thấp, cả hai depend abstraction.",[477,1205,1207],{"className":479,"code":1206,"language":481,"meta":482,"style":482},"\u002F\u002F ❌ Service gắn cứng vào concrete\nclass OrderService { SqlRepo repo = new(); }\n\n\u002F\u002F ✅ Depend interface\nclass OrderService {\n    private readonly IOrderRepo _repo;\n    public OrderService(IOrderRepo repo) => _repo = repo;\n}\n",[484,1208,1209,1214,1219,1223,1228,1233,1238,1243],{"__ignoreMap":482},[487,1210,1211],{"class":489,"line":490},[487,1212,1213],{},"\u002F\u002F ❌ Service gắn cứng vào concrete\n",[487,1215,1216],{"class":489,"line":496},[487,1217,1218],{},"class OrderService { SqlRepo repo = new(); }\n",[487,1220,1221],{"class":489,"line":502},[487,1222,1181],{"emptyLinePlaceholder":1180},[487,1224,1225],{"class":489,"line":508},[487,1226,1227],{},"\u002F\u002F ✅ Depend interface\n",[487,1229,1230],{"class":489,"line":514},[487,1231,1232],{},"class OrderService {\n",[487,1234,1235],{"class":489,"line":520},[487,1236,1237],{},"    private readonly IOrderRepo _repo;\n",[487,1239,1240],{"class":489,"line":526},[487,1241,1242],{},"    public OrderService(IOrderRepo repo) => _repo = repo;\n",[487,1244,1245],{"class":489,"line":1075},[487,1246,529],{},[432,1248,1250],{"id":1249},"_26-dip-và-di-có-giống-nhau-không","26. DIP và DI có giống nhau không?",[437,1252,1253],{},[447,1254,874],{},[546,1256,1257,1264],{},[444,1258,1259,1260,1263],{},"DIP = ",[447,1261,1262],{},"nguyên lý"," (depend on abstraction).",[444,1265,1266,1267,1270],{},"DI = ",[447,1268,1269],{},"kỹ thuật\u002Fpattern"," thực thi DIP (constructor injection, framework như ASP.NET Core).",[432,1272,1274],{"id":1273},"_27-trong-aspnet-core-solid-nguyên-lý-nào-được-dùng-nhiều-nhất","27. Trong ASP.NET Core, SOLID nguyên lý nào được dùng nhiều nhất?",[437,1276,1277,1280],{},[447,1278,1279],{},"D — Dependency Inversion",", qua built-in DI container. Mọi service đăng ký bằng interface, inject qua constructor.",[427,1282,1284],{"id":1283},"e-design-pattern-fresher-hay-được-hỏi","E. Design pattern fresher hay được hỏi",[432,1286,1288],{"id":1287},"_28-design-pattern-là-gì-có-mấy-nhóm","28. Design pattern là gì? Có mấy nhóm?",[437,1290,1291],{},"Giải pháp tái sử dụng cho vấn đề lập trình lặp lại. 3 nhóm GoF:",[546,1293,1294,1300,1306],{},[444,1295,1296,1299],{},[447,1297,1298],{},"Creational",": Singleton, Factory, Builder...",[444,1301,1302,1305],{},[447,1303,1304],{},"Structural",": Adapter, Decorator, Facade...",[444,1307,1308,1311],{},[447,1309,1310],{},"Behavioral",": Strategy, Observer, Command...",[432,1313,1315],{"id":1314},"_29-singleton-implement-sao-cho-thread-safe","29. Singleton — implement sao cho thread-safe?",[477,1317,1319],{"className":479,"code":1318,"language":481,"meta":482,"style":482},"public sealed class Logger {\n    private static readonly Lazy\u003CLogger> _instance = new(() => new Logger());\n    public static Logger Instance => _instance.Value;\n    private Logger() {}\n}\n",[484,1320,1321,1326,1331,1336,1341],{"__ignoreMap":482},[487,1322,1323],{"class":489,"line":490},[487,1324,1325],{},"public sealed class Logger {\n",[487,1327,1328],{"class":489,"line":496},[487,1329,1330],{},"    private static readonly Lazy\u003CLogger> _instance = new(() => new Logger());\n",[487,1332,1333],{"class":489,"line":502},[487,1334,1335],{},"    public static Logger Instance => _instance.Value;\n",[487,1337,1338],{"class":489,"line":508},[487,1339,1340],{},"    private Logger() {}\n",[487,1342,1343],{"class":489,"line":514},[487,1344,529],{},[437,1346,1347,1350],{},[484,1348,1349],{},"Lazy\u003CT>"," đảm bảo chỉ 1 instance, lazy init, thread-safe.",[432,1352,1354],{"id":1353},"_30-factory-pattern-khi-nào-dùng","30. Factory pattern — khi nào dùng?",[437,1356,1357],{},"Khi tạo object có logic phức tạp, hoặc decide concrete class lúc runtime.",[477,1359,1361],{"className":479,"code":1360,"language":481,"meta":482,"style":482},"class ShapeFactory {\n    public IShape Create(string type) => type switch {\n        \"circle\" => new Circle(),\n        \"square\" => new Square(),\n        _ => throw new()\n    };\n}\n",[484,1362,1363,1368,1373,1378,1383,1388,1393],{"__ignoreMap":482},[487,1364,1365],{"class":489,"line":490},[487,1366,1367],{},"class ShapeFactory {\n",[487,1369,1370],{"class":489,"line":496},[487,1371,1372],{},"    public IShape Create(string type) => type switch {\n",[487,1374,1375],{"class":489,"line":502},[487,1376,1377],{},"        \"circle\" => new Circle(),\n",[487,1379,1380],{"class":489,"line":508},[487,1381,1382],{},"        \"square\" => new Square(),\n",[487,1384,1385],{"class":489,"line":514},[487,1386,1387],{},"        _ => throw new()\n",[487,1389,1390],{"class":489,"line":520},[487,1391,1392],{},"    };\n",[487,1394,1395],{"class":489,"line":526},[487,1396,529],{},[432,1398,1400],{"id":1399},"_31-repository-pattern-vì-sao-dùng","31. Repository pattern — vì sao dùng?",[437,1402,1403,1404,1407],{},"Tách data access ra khỏi business logic. Service không biết DB là SQL hay Mongo — chỉ biết ",[484,1405,1406],{},"IUserRepository",". Dễ test (mock), dễ swap DB.",[432,1409,1411],{"id":1410},"_32-strategy-pattern-ví-dụ","32. Strategy pattern — ví dụ?",[477,1413,1415],{"className":479,"code":1414,"language":481,"meta":482,"style":482},"interface IDiscount { decimal Apply(decimal p); }\nclass TenPct  : IDiscount { ... }\nclass Student : IDiscount { ... }\n\nclass Cart {\n    private readonly IDiscount _strategy;\n    public Cart(IDiscount s) => _strategy = s;\n}\n",[484,1416,1417,1422,1427,1432,1436,1441,1446,1451],{"__ignoreMap":482},[487,1418,1419],{"class":489,"line":490},[487,1420,1421],{},"interface IDiscount { decimal Apply(decimal p); }\n",[487,1423,1424],{"class":489,"line":496},[487,1425,1426],{},"class TenPct  : IDiscount { ... }\n",[487,1428,1429],{"class":489,"line":502},[487,1430,1431],{},"class Student : IDiscount { ... }\n",[487,1433,1434],{"class":489,"line":508},[487,1435,1181],{"emptyLinePlaceholder":1180},[487,1437,1438],{"class":489,"line":514},[487,1439,1440],{},"class Cart {\n",[487,1442,1443],{"class":489,"line":520},[487,1444,1445],{},"    private readonly IDiscount _strategy;\n",[487,1447,1448],{"class":489,"line":526},[487,1449,1450],{},"    public Cart(IDiscount s) => _strategy = s;\n",[487,1452,1453],{"class":489,"line":1075},[487,1454,529],{},[437,1456,1457],{},"Đổi strategy chỉ cần inject implementation khác.",[432,1459,1461],{"id":1460},"_33-observer-pattern-và-event-của-c-liên-hệ-ra-sao","33. Observer pattern và event của C# liên hệ ra sao?",[437,1463,1464,1465,1468],{},"Event chính là ",[447,1466,1467],{},"Observer pattern built-in",": subject (event publisher) thông báo nhiều observer (subscriber) khi state đổi.",[432,1470,1472],{"id":1471},"_34-decorator-pattern-ví-dụ-trong-net","34. Decorator pattern — ví dụ trong .NET?",[437,1474,1475,1478,1479,798,1482,798,1485,1488],{},[484,1476,1477],{},"Stream"," chain: ",[484,1480,1481],{},"FileStream",[484,1483,1484],{},"BufferedStream",[484,1486,1487],{},"CryptoStream",". Mỗi cấp add chức năng (buffer, encrypt) mà không sửa class gốc.",[432,1490,1492],{"id":1491},"_35-unit-of-work-pattern","35. Unit of Work pattern?",[437,1494,1495,1496,1499,1500,573],{},"Nhóm nhiều thao tác DB thành 1 transaction. EF Core ",[484,1497,1498],{},"DbContext"," chính là Unit of Work — track changes, commit hết bằng ",[484,1501,1502],{},"SaveChanges()",[427,1504,1506],{"id":1505},"f-câu-gài-hay-gặp","F. Câu gài hay gặp",[432,1508,1510,1511,1513],{"id":1509},"_36-cho-class-có-1-method-virtual-nhưng-class-không-có-instance-đây-là-class-gì","36. Cho class có 1 method ",[484,1512,615],{}," nhưng class không có instance — đây là class gì?",[437,1515,1516,1519,1520,1522],{},[447,1517,1518],{},"Không thể."," Method ",[484,1521,615],{}," cần class concrete để instantiate. Nếu class abstract → method có thể abstract, không nhất thiết virtual.",[432,1524,1526,1527,1530],{"id":1525},"_37-override-tostring-của-object-vì-sao-nên","37. Override ",[484,1528,1529],{},"ToString"," của object — vì sao nên?",[437,1532,1533,1534,1537,1538,1540],{},"Để debug\u002Flog đẹp hơn. Khi ",[484,1535,1536],{},"Console.WriteLine(obj)"," hoặc string interpolation, runtime gọi ",[484,1539,1529],{},". Mặc định trả tên class.",[432,1542,1544],{"id":1543},"_38-vì-sao-c-không-hỗ-trợ-đa-kế-thừa-class","38. Vì sao C# không hỗ trợ đa kế thừa class?",[437,1546,1547,1548,1551],{},"Tránh ",[447,1549,1550],{},"diamond problem",": nếu 2 base có cùng method, không rõ con kế thừa cái nào. C# chọn interface (chỉ contract, không state) làm giải pháp.",[432,1553,1555],{"id":1554},"_39-composition-khác-aggregation-khác-association","39. Composition khác Aggregation khác Association?",[546,1557,1558,1564,1570],{},[444,1559,1560,1563],{},[447,1561,1562],{},"Association",": 2 class biết nhau (User và Order).",[444,1565,1566,1569],{},[447,1567,1568],{},"Aggregation",": \"has-a\" yếu — sống độc lập (Library has Books, đóng Library, Books vẫn còn).",[444,1571,1572,1575],{},[447,1573,1574],{},"Composition",": \"has-a\" mạnh — vòng đời gắn liền (House has Rooms, phá House, Room mất).",[432,1577,1579],{"id":1578},"_40-cohesion-và-coupling-định-nghĩa","40. Cohesion và Coupling — định nghĩa?",[546,1581,1582,1591],{},[444,1583,1584,1587,1588],{},[447,1585,1586],{},"Cohesion",": mức độ các phần trong 1 module liên kết với nhau. ",[447,1589,1590],{},"Cao = tốt.",[444,1592,1593,1595,1596,1599,1600],{},[447,1594,660],{},": mức độ phụ thuộc giữa các module. ",[447,1597,1598],{},"Thấp = tốt.","\nNguyên tắc: ",[447,1601,1602],{},"High cohesion, low coupling.",[432,1604,1606],{"id":1605},"_41-kiss-dry-yagni-là-gì","41. KISS, DRY, YAGNI là gì?",[546,1608,1609,1615,1621],{},[444,1610,1611,1614],{},[447,1612,1613],{},"KISS",": Keep It Simple, Stupid.",[444,1616,1617,1620],{},[447,1618,1619],{},"DRY",": Don't Repeat Yourself.",[444,1622,1623,1626],{},[447,1624,1625],{},"YAGNI",": You Aren't Gonna Need It (đừng code cho future không chắc).",[432,1628,1630],{"id":1629},"_42-law-of-demeter-principle-of-least-knowledge","42. Law of Demeter (Principle of Least Knowledge)?",[437,1632,1633],{},"\"Don't talk to strangers.\" Object chỉ gọi method của:",[546,1635,1636,1639,1642,1645],{},[444,1637,1638],{},"Chính nó,",[444,1640,1641],{},"Tham số được truyền vào,",[444,1643,1644],{},"Object nó tạo,",[444,1646,1647,1648,1651],{},"Field instance.\nTránh chain dài: ",[484,1649,1650],{},"a.B.C.D.Do()"," — vi phạm vì biết quá nhiều cấu trúc.",[1653,1654],"hr",{},[437,1656,1657,1658],{},"➡️ Tiếp theo: ",[1659,1660,1661],"a",{"href":84},"Ngân hàng câu hỏi SQL",[1663,1664,1665],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":482,"searchDepth":496,"depth":496,"links":1667},[1668,1679,1687,1693,1703,1713],{"id":429,"depth":496,"text":430,"children":1669},[1670,1671,1672,1673,1674,1675,1676,1677,1678],{"id":434,"depth":502,"text":435},{"id":471,"depth":502,"text":472},{"id":543,"depth":502,"text":544},{"id":576,"depth":502,"text":577},{"id":594,"depth":502,"text":595},{"id":622,"depth":502,"text":623},{"id":633,"depth":502,"text":634},{"id":652,"depth":502,"text":653},{"id":676,"depth":502,"text":677},{"id":699,"depth":496,"text":700,"children":1680},[1681,1682,1683,1684,1685,1686],{"id":703,"depth":502,"text":704},{"id":779,"depth":502,"text":780},{"id":816,"depth":502,"text":817},{"id":830,"depth":502,"text":831},{"id":837,"depth":502,"text":838},{"id":868,"depth":502,"text":869},{"id":882,"depth":496,"text":883,"children":1688},[1689,1690,1691,1692],{"id":886,"depth":502,"text":887},{"id":928,"depth":502,"text":929},{"id":948,"depth":502,"text":949},{"id":972,"depth":502,"text":973},{"id":986,"depth":496,"text":987,"children":1694},[1695,1696,1697,1698,1699,1700,1701,1702],{"id":990,"depth":502,"text":991},{"id":1029,"depth":502,"text":1030},{"id":1093,"depth":502,"text":1094},{"id":1125,"depth":502,"text":1126},{"id":1154,"depth":502,"text":1155},{"id":1199,"depth":502,"text":1200},{"id":1249,"depth":502,"text":1250},{"id":1273,"depth":502,"text":1274},{"id":1283,"depth":496,"text":1284,"children":1704},[1705,1706,1707,1708,1709,1710,1711,1712],{"id":1287,"depth":502,"text":1288},{"id":1314,"depth":502,"text":1315},{"id":1353,"depth":502,"text":1354},{"id":1399,"depth":502,"text":1400},{"id":1410,"depth":502,"text":1411},{"id":1460,"depth":502,"text":1461},{"id":1471,"depth":502,"text":1472},{"id":1491,"depth":502,"text":1492},{"id":1505,"depth":496,"text":1506,"children":1714},[1715,1717,1719,1720,1721,1722,1723],{"id":1509,"depth":502,"text":1716},"36. Cho class có 1 method virtual nhưng class không có instance — đây là class gì?",{"id":1525,"depth":502,"text":1718},"37. Override ToString của object — vì sao nên?",{"id":1543,"depth":502,"text":1544},{"id":1554,"depth":502,"text":1555},{"id":1578,"depth":502,"text":1579},{"id":1605,"depth":502,"text":1606},{"id":1629,"depth":502,"text":1630},"40+ câu hỏi OOP, SOLID, Design Pattern cho fresher .NET — kèm đáp án ngắn.","md",null,{},{"title":78,"icon":81},{"title":422,"description":1724},"6bH4WInYw0dv59kFiNBm1mAbBSq7g7Cx_U26oep7Y4s",[1732,1734],{"title":73,"path":74,"stem":75,"description":1733,"icon":76,"children":-1},"60+ câu hỏi C# fresher\u002Fjunior hay gặp nhất ở phỏng vấn .NET tại HCM — kèm đáp án ngắn gọn.",{"title":83,"path":84,"stem":85,"description":1735,"icon":86,"children":-1},"40+ câu hỏi SQL\u002FSQL Server fresher .NET hay gặp — JOIN, INDEX, normalization, transaction, query thực tế.",1783490354516]