Interview Notes

  • Home
  • Blog
    • Ntech Developers
    • Fanpage
    • Group
    • Github
  • Interview Notes
  • Social
    • Facebook
    • Twitter
    • Linkedin
  • About
  • Contact me

Khi nào dùng store khi nào dùng function?

Phân biệt 2 loại Index?
Phân biêt truncate table và delete table?

Phân biệt net framework và net core?
So sánh ControllerBase và Controller?
So sánh ICollection và IList?
Nêu lifecycle của Net Core, phân biệt AddSingleton, AddScoped và AddTransient?
So sánh Cookie và Session?

Khi nào dùng Local Storage, khi nào dùng Session Storage
Bạn biết gì về Identity Server 4 không? Phân biệt các loại Grant type trong IS4?
Mô tả hoạt động của CQRS?

Khi nào dùng Refresh token, khi nào dùng Revoke token?
Nêu cơ chế hoạt động của Saga Pattern?
Dùng masstransit cho những trường hợp nào?
So sánh RabbitMQ và Kafka?

So sánh http1 và http2?
So sánh grpc và http protocol?


 - Giới thiệu về bản thân

- Nói sơ lược về công nghệ của dự án gần nhất?

- So sánh Net Framwork và Net Core?
- Net core 3.1 có gì khác biệt với Net 5 và 6 không?
- So sánh 3 mô hình MVC, MVVM, MVP?

- So sánh IList và IEnumrable?
- So sánh String và StringBuilder?

- Sự khác biệt giữa http1 và http2?
- So sánh Rest và gRPC? Khi nào sử dụng gRPC và nó có những ưu điểm gì?
- So sánh giữa Controller và BaseController?
- Em đã từng dùng gì cho Authentication và Authorization?
- Có mấy loại Authen trong Identity Server 4? Em có biết Revoke trong IS4 không? Nó hoạt động như thế nào?

- Em có biết DI không? Có mấy loại DI trong dotnet và so sánh chúng
- Em biết gì về middleware không? Đã bao giờ custom middleware chưa?

- So sánh Single và First trong Entity Framwork, So sánh Single và SingleOrDefault?
- So sánh Entity Framwork và Dapper
- Có hay làm việc với store procedure không? Có khi khác biệt giữa việc dùng và không dùng không?
- Em có biết gì về Index không? Có mấy loại Index và so sánh chúng?
- Sự khác biệt giữa linq và raw sql?

- Em có hay dùng logging không? Nếu member thưởng quên log thì em có cách nào vẫn có log để tracing không?
- Em sử dụng gì để viết Unit Test? Sự khác biệt giữa moq, fake và stub?
- Trong microservice, có những cách nào để các services giao tiếp được với nhau?
- Em đã dùng message queue chưa? Nó được sử dụng trong trường hợp nào?
- Em đã từng xử lý bài toàn nhiều request cùng một lúc chưa? Có cách nào để đảm bảo tính toàn vẹn của các transaction không?
- Deadlock xảy ra trong những trường hợp như thế nào?

- Em đã từng dùng design pattern chưa? Nói một chi tiết thử vài design pattern mà em hay dùng?
- Em biết gi về solid không? chữ L trong đó là gì, nói cụ thể?

- Em từng dùng những công cụ gì cho CI/CD? Em biết Jenkin chứ? Em đã từng build pipeline CI/CD chưa?
- Làm thế nào để monitoring các services trong Microservices?

...










 1. Bài test: 30 phút

Gồm 4 phần:
OOP
Data structure
Database
Design pattern

1.1
– Câu hỏi trắc nghiệm liên quan đến 4 thuộc tính 5 câu
– Câu hỏi đọc code và tìm lỗi output 2 câu
– Câu hỏi tổng hợp OOP 5 câu (chọn nhiều đáp án cùng một lúc)
– Câu hỏi chuyên OOP cho .net 3 câu (Ví dụ đơn kế thừa trong .net hay từ khóa sealed c#)

1.2
– Câu hỏi về một số thuật toán cơ bản (sort, search), các hạn chế của thuật toán đó. 3 câu
– Các cấu trúc colection, concurent colection. 2 câu
– Câu hỏi về liên kết đơn, đôi, vòng. 2 câu
– Câu hỏi tổng hợp về tối ưu các sử dụng kiểu dữ liệu 3 câu

1.3
– Câu hỏi khái niệm, diễn dải từ viết tắt, các loại database 3 câu
– Câu hỏi về mô hình hóa, ORM 2 câu
– Câu hỏi về chuẩn hóa dữ liệu NF1,2,3; Cho 1 database, hỏi nó đã chuẩn hóa chưa, mắc phải lỗi chuẩn hóa số mấy. 2 câu
– Câu hỏi về T-SQL, các câu lệnh, cho 1 database chọn câu lệnh nào có output đúng (join, like, group by, having in) 3 câu

1.4
– Câu hỏi liên quan đến khái niệm, các loại, khi nào sử dụng pattern. 5 câu
– Câu hỏi cho đoạn code có sẵn, hỏi đó là implement pattern nào. 2 câu
– Câu hỏi chọn đáp án trường hợp nào kết hợp 2 pattern. 1 câu

2. PV technical: 2 người. 1 ng team leader, 1 ng hình như là line manager
– Hỏi về quá trình làm trước đó, công nghệ sử dụng trong các dự án
– Có làm web mvc web api bao giờ chưa
– Khác nhau MVVM và MVC
– So sánh web api và wcf
– Ngoài wcf còn biết công nghệ nào tương tự không
– Nói các mối liên hệ của web MVC
– So sánh MVC trước đó và MVC core
– Authencatio, identity trong web MVC
– Có bao nhiêu cách trao đổi data giữa Controller và view
– Em biết razor k, sơ lược về hoạt động của razor
– Trong controller a có Action nhận object từ view. Em có bao nhiêu cách validate object đó
– So sánh Session, cookie, state. Em xài từng thứ đó khi nào
– Em đã từng custom validation chưa. Thử nói 1 cái đơn giản xem
– Em có custom EditorFor chưa. Khi nào cần phải custom
– So sánh HtmlString và html thường, Em đã custom error với htmlstring bao giờ chưa
– Em xài framework j để làm việc với database
– EF core khác EF trước đó ntn
– Em có xái linq để làm việc vs database hay khi
– Hoạt động của linq như thế nào. Khi nào thì nó generate ra chuỗi truy vấn, runtime hay complile time
– Có mấy cách làm việc vs EF, so sánh code first và database first, cái nào tốt hơn, khi nào xài cái nào
– Em biết bao nhiêu framework javascript so sánh
– Nếu anh có case bất đồng bộ thì em xài hàm nào trong javascript
– A muốn call Action trong controller của MVC thì xài hàm nào trong javascript.
– Em đã custom component angular bao giờ chưa.
– Cách kết hợp angular 4 và MVC như thế nào
– Angular hay React có thể thay thế javascript trong web MVC được không
– Trong web MVC application, javascript có thể tương tác với database mà không thông qua web MVC được không?

3. HR
– Hỏi mức lương hiện tại, mức lương mong muốn
– Định hướng 3-5 năm tới
– Tại sao lại muốn nhảy việc
– Giới thiệu cty, quy trình, đãi ngộ các kiểu
– Em có câu hỏi gì không?

 Git stash được sử dụng khi muốn lưu lại các thay đổi chưa commit, thường rất hữu dụng khi bạn muốn đổi sang 1 branch khác mà lại đang làm dở ở branch hiện tại.

Lệnh git stash sẽ có tác dụng với tất cả dữ liệu đang hoạt động trong working directory với điều kiện là dữ liệu đó đã được đưa vào trạng thái Staged hoặc đã từng được committed.Git stash save
- Git stash list
- Git stash apply
- Git stash pop
- Git stash show
- Git stash branch <name>
- Git stash clear
- Git stash drop

Git cherry-pick là một cách để checkout 1 commit bất kỳ tại 1 branch được chỉ định về brach hiện tại.
Hay chính là git cherry-pick sẽ mang thay đổi của 1 commit trên 1 nhánh nào đó áp dụng vào nhánh hiện tại.
Sử dụng nó khi muốn 1 pull request merge vào nhiều nhánh môi trường khác nhau.

Git Rebase sẽ giúp loại bỏ những commit không cần thiết như khi sử dụng git merge và giúp tạo ra lịch sử commit có dạng tuyến tính, xuyên suốt project từ khi bắt đầu cho đến hiện tại.
Ta có thể dễ dàng điều hướng và kiểm tra lịch sử project bằng git log.
Rebase sẽ tạo commit nằm phía trên commit mới nhất.
Ta sử dụng git rebase nếu như muốn các sự thay đổi thuộc về branch của mình luôn luôn là mới nhất.

Git Merge là cách có thể tích hợp với master hay với rất nhiều nhánh trong 1 lần.
Tuy nhiên trường hợp tích hợp bằng merge thì những commit của branch sẽ hoàn toàn không được record lại
Ta sử dụng git merge nếu muốn sắp xếp các commit theo mặc định

 Concurrency:

Doing more than one thing at a time.
Là làm nhiều hơn một việc trong cùng một thời gian.

Multithreading
A form of concurrency that uses multiple threads of execution.
Nhiều máy tính cá nhân và workstations có nhiều CPU core cho phép nhiều thread có thể thực hiện tác vụ đồng thời. Để tối ưu lợi thế của phần cứng, bạn có thể chạy song song (parallelize) code để phân tán công việc trên nhiều processor.
Multithreading liên quan tới việc sử dụng nhiều thread cùng lúc. Đó là 1 dạng của concurrency, nhưng không phải là dạng duy nhất.
Multithreading được ứng dụng ở thread pool, nơi mà các thread được phân bổ tự động để đáp ứng các request.

Parallel processing
Doing lots of work by dividing it up among multiple threads that run concurrently.
Parallel processing (hay là parallel programming) sử dụng multithreading để tối ưu hóa việc sử dụng nhiều processor.
Các CPUs ngày nay đều có nhiều core, nếu có nhiều công việc cần xử lý, Parallel processing sẽ chia nhỏ công việc ra nhiều thread, và các thread có thể chạy độc lập trên mỗi core khác nhau.
Parallel processing là 1 loại của Multithreading và multithreading là 1 loại của concurrency.

Asynchronous Programming
A form of concurrency that uses futures or callbacks to avoid unnecessary threads.
Asynchronous programming là 1 thể loại khác của concurrency vô cùng mạnh mẽ, sử dụng keywork async và await, lập trình đơn giản như synchronous (nonconcurrent).

Reactive Programming
A declarative style of programming where the application reacts to events.
Một loại khác của concurrency là reactive programming. Asynchronous programing cho phép ứng dụng start 1 operation mà sẽ hoàn thành ở 1 thời gian sau đó.
Reactive programming cũng gần giống như asynchronous programming, nhưng nó được xây dựng dựa trên các asynchronous event thay vì asynchronous operation.

 React

React là một thư viện JavaScript, được Facebook ra mắt từ năm 2013.
Đây là một thư viện tuyệt vời để xây dựng các ứng dụng web lớn, nơi dữ liệu có thể thay đổi thường xuyên.

Ưu điểm:
- Dễ học, nhờ thiết kế đơn giản, sử dụng JSX (một cú pháp giống như HTML) để tạo khuôn mẫu.
- Tốc độ ứng dụng vô cùng ấn tượng. Tất cả là nhờ kỹ thuật DOM ảo của React và tối ưu hóa rendering.
- Hỗ trợ render phía máy chủ rất tốt. Điều này làm cho React trở thành một framework mạnh mẽ cho các ứng dụng tập trung vào nội dung.
- Hỗ trợ tạo ứng dụng Progressive Web App (PWA) nhanh chóng. Đơn giản chỉ cần câu lệnh: “creat-react-app”.
- Data-binding một chiều, có nghĩa là ít side effects không mong muốn.
- Mô hình Redux: một mô hình quản lý trạng thái ứng dụng cực tốt.
- React theo trường phái lập trình hàm (Functional Programming), tạo mã dễ kiểm tra và có khả năng tái sử dụng cao.
- Ngoài ra, còn một ưu điểu cực lớn nữa, đó là nếu bạn biết về React thì bạn sẽ dễ dàng học thêm React Native.

Nhược điểm
- Chính vì sự phát triển siêu nhanh của ReactJS mà tài liệu hướng dẫn chính chủ không theo kịp. Hầu hết các bài viết hướng dẫn trên mạng bị lỗi thời. Điều này gây không ít khó khăn cho các dev nhà mình.
- React đang đi theo hướng lập trình hàm, điều này sẽ gây đôi chút khó chịu và ác cảm với các dev đã quen với lập trình hướng đối tượng (OOP).
- Việc trộn giữa templating với logic ứng dụng (JSX) có thể gây nhầm lẫn cho một số nhà phát triển lúc đầu.

Angular
Angular là một JavaScript MVVM framework, được ra mắt từ 2009.
Đây là một JS framework nổi đình đám trong giới front-end, giúp xây dựng các ứng dụng web có tính tương tác cao.

Ưu đểm:
- Hỗ trợ trợ TypeScript: Angular được tạo ra để được sử dụng cùng với TypeScript. Mà TypeScript thì bạn biết rồi đấy, nó mang ưu điểm của cả Js và các ngôn ngữ OOP.
- Data-binding: Nó tự động đồng bộ hóa dữ liệu giữa thành phần model và view.
- Tài liệu hướng dẫn chi tiết và đầy đủ. Với tài liệu hướng dẫn chi tiết từ chính nhà cung cấp sẽ giúp người mới tìm hiểu Angular nhanh chóng tiếp cận và làm chủ framework này. Nhờ đó mà giảm thời gian training, thảo luận với đồng nghiệp… khi mà trên trang chủ của họ có tất cả.
- MVVM (Model-View-ViewModel): cho phép bạn chia dự án thành nhiều phần độc lập với nhau.
- Dependency Injection: Nó cho phép bạn làm giảm sự phụ thuộc giữa các Object với nhau. Các object càng độc lập với nhau càng tốt, mục đích để sau này nâng cấp, sửa đổi… sẽ hạn chế ảnh hưởng tới các object khác.
- Cấu trúc và kiến trúc của Angular được tạo ra đặc biệt cho khả năng mở rộng dự án lớn.

Nhược điểm:
- Angular khá là đa dạng các thành phần/khái niệm như Injectables, Components, Pipes, Modules… Điều này khiến cho việc tìm hiểu trở nên khó khăn hơn một chút so với React và Vuejs
- Theo đánh giá hiệu năng thì Angular có vẻ chậm hơn React và Vuejs.

Vue
Vue.js là một framework JavaScript, được ra mắt vào năm 2013, hoàn toàn phù hợp để tạo giao diện người dùng có khả năng thích ứng cao và các ứng dụng trang đơn phức tạp.

Ưu điểm:
- Empowered HTML: điều này có nghĩa là Vue.js có nhiều đặc điểm tương tự với Angular. Chính vì thế nó có thể giúp tối ưu hóa việc xử lý các khối HTML khi sử dụng các thành phần khác nhau.
- Tài liệu hướng dẫn chi tiết: Nhờ có tài liệu chi tiết mà việc học tập trở nên nhanh chóng, tiết kiệm thời gian phát triển ứng dụng chỉ sử dụng kiến thức cơ bản về HTML và JavaScript.
- Khả năng tương thích. Việc chuyển sang sử dụng Vuejs từ các Js framework tương đối nhanh chóng.
- Khả năng tích hợp tốt.js có thể được sử dụng cho việc xây dựng cả ứng dụng (single-page applications) phức tạp hoặc chỉ một phần của ứng dụng. Điều này cho phép bạn cập nhật, nâng cấp ứng dụng mà không ảnh hưởng quá nhiều tới hệ thống hiện tại.
- Large scaling: js có thể phát triển templates có khả năng tái sử dụng cao.
- Kích thước nhỏ. Toàn bộ thư viện js chỉ có kích thước 20KB.


Nhược điểm:
Thiếu tài nguyên: Vuejs vẫn có thị phần khá nhỏ so với React hoặc Angular. Điều đó có nghĩa là việc chia sẻ kiến thức trong cộng đồng vẫn còn khá ít. Nếu bạn gặp khó khăn hoặc phát sinh bug thì chỉ có tác giả là nhiệt tình với bạn thôi.


 Code First:

Viết các class Model bằng code C# và generate Database từ class Model.

Ưu điểm:
- Rất phổ biến (vì các lập trình viên thường không thích thiết kế DB, nhưng thích thiết kế class)
- Kiểm soát hoàn toàn code model, thêm xóa sửa thuộc tính vô cùng dễ dàng
- Không phải nặng đầu suy nghĩ về DB. Đối với cách tiếp cận này, DB chỉ là cái “cục” data, lôi ra xài thôi
- Có thể version control Database

Nhược điểm
- Các thay đổi cấu trúc trực tiếp trên DB sẽ mất
- Khó kiểm soát những column sẽ tạo trên Db
- Hơi khó khi kết hợp với Db có sẵn

Database First:
Generate Model từ Database có sẵn và các class model sẽ ko được phép chỉnh sửa vì database không đổi.

Ưu điểm:
- Ít phổ biến hơn
- DB có thể được develop riêng
- Dùng được DB có sẵn
- Entity Framework sẽ tạo ra các Entity class cho bạn

Nhược điểm
- Không thể thay đổi code đã được Generate
- Khó khăn khi muốn thêm các DataAttribute và DisplayAttribute cho các class model
- Khó khăn khi muốn biểu diễn các kiểu quan hệ cha con của class
- Mỗi lần thay đổi cấu trúc DB, bạn sẽ phải update lại mapping và model để phản ánh sự thay đổi đó

 IEnumerable nằm trong namespace System.Collections

IEnumerable là một list hay contatiner giữ các item chỉ hỗ trợ filter nhưng không thể chỉnh sửa các item như thêm, xoá, sửa, đếm...
IQueryable, IList, IDictionary, ICollection kế thừa IEnumerable Interface.

- ICollection là interface cơ bản nhất trong số các interface đã liệt kê.
Đó là một interface có thể đếm được hỗ trợ Count và đó là về nó.
- IList kế thừa IEnumerable và ICollection, nhưng nó cũng hỗ trợ thêm và xóa các mục, truy xuất các mục theo chỉ mục...
Đó là giao diện được sử dụng phổ biến nhất cho "danh sách các đối tượng", điều mà tôi biết.
- IQueryable là một interface có thể liệt kê hỗ trợ LINQ.
Bạn luôn có thể tạo IQueryable từ IList và sử dụng LINQ tới Objects, nhưng bạn cũng thấy IQueryable được sử dụng để thực hiện hoãn lại các câu lệnh SQL trong LINQ to SQL và LINQ to Entities.
- IDictionary là một interface khác với ánh xạ các khóa duy nhất đến các giá trị.

IQueryable
+ IQueryable tốt nhất cho truy vấn dữ liệu out-memory như là database.
+ Khi truy vấn, IQueryable thực thi câu lệnh truy vấn và lọc dữ liệu trên Server luôn.
+ IQueryable hỗ trợ lazy loading. Vì thế nó phù hợp cho trường hợp phân trang.
+ IQueryable hỗ trợ custom query sử dụng phương thức CreateQuery và Execute.

 Câu lệnh SELECT dùng để lấy các hàng từ cơ sở dữ liệu và cho phép lựa chọn một hoặc nhiều hàng hoặc cột từ một hoặc nhiều bảng.


Câu lệnh WHERE là mệnh đề được dùng để lọc kết quả bởi các điều kiện, kết quả trả về phải đáp ứng các điều kiện trong mệnh đề này. Khi đã có các table đích để lấy dữ liệu, thì chắc hẳn mới đến mệnh đề WHERE để lọc lại dữ liệu đó.

 Index database là gì?

Index là một cấu trúc dữ liệu được dùng để định vị và truy cập nhanh nhất vào dữ liệu trong các bảng database
Index là một cách tối ưu hiệu suất truy vấn database bằng việc giảm lượng truy cập vào bộ nhớ khi thực hiện truy vấn

Index có thể được tạo cho một hoặc nhiều cột trong database. Index thường được tạo mặc định cho primary key, foreign key.
Ngoài ra, ta cũng có thể tạo thêm index cho các cột nếu cần.

Cụ thể:
- Single-Column Index trong SQL
Chỉ mục cho một cột đơn là một chỉ mục được tạo dựa trên chỉ một cột trong bảng.

CREATE INDEX ten_chi_muc ON ten_bang (ten_cot);

- Unique index trong SQL
Unique index được sử dụng không chỉ để tăng hiệu suất, mà còn cho mục đích toàn vẹn dữ liệu.
Một Unique index không cho phép bất kỳ bản sao giá trị nào được chèn vào trong bảng.

CREATE UNIQUE INDEX ten_chi_muc ON ten_bang (ten_cot);

- Composite Index trong SQL
Composite Index là một chỉ mục cho hai hoặc nhiều cột trong một bảng.

CREATE INDEX ten_chi_muc ON ten_bang (cot1, cot2);

Implicit Index trong SQL
Implicit Index (có thể hiểu là chỉ mục ngầm định) là chỉ mục mà được tạo tự động bởi Database Server khi một đối tượng được tạo.
Các chỉ mục được tạo tự động cho các ràng buộc Primary key và các ràng buộc Unique.


Hai dạng Index Database:
- B-Tree: Dữ liệu index trong B-Tree được tổ chức và lưu trữ theo dạng tree, tức là có root, branch, leaf.
- Hash Index: Dữ liệu index được tổ chức theo dạng Key - Value được liên kết với nhau.

Hai loại Index phổ biến (2 loại này đều thuộc B-Tree):
- Clustered index
Một clustered index (chỉ mục được phân cụm) là một loại tệp sắp xếp thông tin trong bảng về đặc tính của chúng. Chỉ có 1 danh sách cho mỗi bảng trong database. Do đó, chỉ có 1 bản ghi nhóm đơn cho mỗi bảng.
Dưới đây là một vài đặc điểm của clustered index:
+ Lưu trữ data mặc định và lưu trữ data được sắp xếp
+ Giúp lưu trữ data và index cùng một lúc
+ Quét Clustered index và tìm kiếm inde
+ Tra cứu khóa

Ưu điểm:
+ Các clustered index là một option lý tưởng cho range hoặc group nhận được các truy vấn loại tối thiểu, tối đa hoặc đếm (count type queries).
+ Bất kỳ tìm kiếm có liên quan nào sẽ đi thẳng đến một điểm cụ thể trong thông tin với mục tiêu có thể tiếp tục đọc liên tục từ bảng.
+ Sử dụng cơ chế định vị để tìm phần tập tin ở đầu range.
+ Một kỹ thuật hay để các tìm kiếm range khi hunt key được đề cập.
+ Giảm thiểu chuyển trang và tối đa hóa các lần truy cập bộ đệm.

Nhược điểm:
+ Hạn chế di chuyển trang và tăng các tìm kiếm dự trữ.
+ Các phương pháp khác nhau cho yêu cầu không liên tiếp
+ Khiến cho nhiều phần trang nhất quán bao gồm trang thông tin giống như trang danh sách liệt kê.
+ Công việc bổ sung để chèn, cập nhật và xóa trong SQL.
+ Cần nỗ lực lâu hơn để làm mới các hồ sơ.
+ Hầu như tất cả data được chứa trong các nút dẫn của chỉ mục.

- Non-Clusterd Index
Một non-clustered index (chỉ mục không được phân cụm) lưu trữ thông tin meta trong một khu vực, đồng thời lưu trữ các tệp trong khu vực khác. Các tập tin bao gồm các con trỏ đến vị trí của thông tin đó.
Một solitary table (bảng đơn) có thể có nhiều non-bunched records (bản ghi không được nhóm) dưới dạng tệp.
Một non-clustered index được xác định trong trường không theo thứ tự của bảng và loại phương thức này cải thiện hiệu năng của các truy vấn khi chúng sử dụng các khóa không được gán làm khóa chính.
Dưới đây là một vài đặc điểm của clustered index:
+ Chỉ lưu trữ các key values
+ Con trỏ tới các hàng Chỉ mục Heap/Clustered
+ Cho phép truy cập data thứ cấp
+ Kết nối data
+ Hoạt động của Index Scan và Index Seek
+ Tạo một non-clustered index gồm cho bảng hoặc dạng view

Ưu điểm:
+ Giúp lấy dữ liệu nhanh chóng từ bảng database.
+ Giảm chi phí hơn so với clustered index.
+ Có thể được sử dụng để tạo nhiều hơn một chỉ mục vì có nhiều chỉ mục không được nhóm trong RDBMS.

Nhược điểm:
+ Lưu trữ dữ liệu theo thứ tự hợp lý nhất mà không cho phép người dùng tự sắp xếp các hàng data.
+ Quá trình tra cứu trên non-clusterd index khá tốn kém.
+ Cần có bản cập nhật tương ứng mỗi khi clustering key (khoá phân cụm) được cập nhật để lưu nó vào non-clustered index.

 Primary key của bảng nếu nó xác định duy nhất từng bộ (hàng) trong bảng đó. Nó thực thi các ràng buộc toàn vẹn đối với bảng.

Unique key cũng xác định duy nhất một bộ giá trị riêng lẻ trong một mối quan hệ.

So sánh Primary key và Unique key
Primary key
- Nó được sử dụng để làm định danh duy nhất cho mỗi hàng trong bảng.
- Nó không chấp nhận giá trị NULL
- Chỉ có duy nhất 1 primary key trong 1 bảng
- Tạo chỉ mục theo nhóm

Unique key
- Nó cũng xác định duy nhất một hàng, nhưng không là khóa chính.
- Nó chấp nhận giá trị NULL
- Có thể nhiều hơn 1 unique key  trong 1 bảng
- Tạo chỉ mục không phân cụm

 Overview

- Dummy: những object được truyền đi qua các hàm nhưng thực ra không hề được sử dụng. Chúng tồn tại chỉ để điền cho đầy đủ danh mục tham số.
- Fake: những objects có implement thực, nhưng thường là bằng một cách mưu hèn kế bẩn nào đó, với mục đích là trông y như thật. Chúng tất nhiên không phù hợp để tiêm vào môi trường production. Chẳng hạn một InMemoryTestDataBase là một ví dụ điển hình.
- Stubs: những object có phản hồi với những lời gọi hàm được tạo ra trong ca kiểm thử, và thường không phản hồi bất kỳ lời gọi nào khác.
- Spies: những stub mà có thêm hành vi ghi lại thông tin gì đấy về những hoạt dộng của chúng. Chẳng hạn một spies của dịch vụ gửi mail có thêm hành vi ghi lại thông tin rằng bao nhiêu email đã được gửi.
- Mocks: là thứ chúng ta đang nói đến trong bài viết này, những object được lập trình sẵn các kỳ vọng về lời gọi sử dụng mà chúng sẽ nhận được, cũng như cách chúng sẽ phản hồi lại.

Mock là gì?
Mock object (MO) là một đối tượng ảo mô phỏng các tính chất và hành vi giống hệt như đối tượng thực được truyền vào bên trong khối mã đang vận hành nhằm kiểm tra tính đúng đắn của các hoạt động bên trong.
Mock object có các đặc điểm sau:
- Đơn giản hơn đối tượng thực nhưng vẫn giữ được sự tương tác với các đối tượng khác.
- Không lặp lại nội dung đối tượng thực.
- Cho phép thiết lập các trạng thái riêng trợ giúp cho việc thực hiện unit test.

Stub là gì?
Stub là một chương trình hoặc thành phần giả lập (thay thế cho chương trình hoặc thành phần chưa code xong để kiểm thử) nó dùng để kiểm thử...

Fake là gì
Fake là một ý nghĩa nói chung, nó có thể chỉ tới một một object thật hoặc một object giả hoặc giả hoặc một cái gì đó không có thật.

 Mediator Pattern

Mediator Patern (mô hình trung gian) được sử dụng để giảm sự phức tạp trong "giao tiếp" giữa các lớp và các đối tượng.
Mô hình này cung cấp một lớp trung gian có nhiệm vụ xử lý thông tin liên lạc giữa các tầng lớp, hỗ trợ bảo trì mã code dễ dàng bằng cách khớp nối lỏng lẻo.
Nhằm kiểm soát cách thức giao tiếp (communication) giữa các object nên thuộc về behavioral (hành vi).
Nó sẽ loại bỏ hết tất cả các communication giữa các component.
Trường hợp ta muốn component A độc lập với các component khác, mediator sẽ xóa tất cả các liên kết tới A.
Sau khi đã xóa, Mediator Object đóng vai trò như người trung gian, tất cả giao tiếp đều phải thông qua Mediator Object.

Mediator để xác định các interface giao tiếp giữa các đối tượng tương đồng.

 - Single responsibility principle

Một class chỉ nên giữ 1 trách nhiệm duy nhất (Chỉ có thể sửa đổi class với 1 lý do duy nhất)

Class giữ cả 3 trách nhiệm: Đọc dữ liệu từ DB, xử lý dữ liệu, in kết quả. Do đó, chỉ cần ta thay đổi DB, thay đổi cách xuất kết quả, … ta sẽ phải sửa đổi class này. Càng về sau class sẽ càng phình to ra.
Theo đúng nguyên lý, ta phải tách class này ra làm 3 class riêng. Tuy số lượng class nhiều hơn những việc sửa chữa sẽ đơn giản hơn, class ngắn hơn nên cũng ít bug hơn.

- Open/closed principle
Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó (open for extension but closed for modification).

Theo nguyên lý này, mỗi khi ta muốn thêm chức năng,.. cho chương trình, chúng ta nên viết class mới mở rộng class cũ ( bằng cách kế thừa hoặc sở hữu class cũ) không nên sửa đổi class cũ.

- Liskov substitution principle
Trong một chương trình, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình

Hãy tưởng tượng bạn có 1 class cha tên Vịt. Các class Vịt Bầu, Vịt Xiêm có thể kế thừa class này, chương trình chạy bình thường.
Tuy nhiên nếu ta viết class Vịt Chạy Pin, cần pin mới chạy được. Khi class này kế thừa class Vịt, vì không có pin không chạy được, sẽ gây lỗi. Đó là 1 trường hợp vi phạm nguyên lý này.

Ta có 2 class cho hình vuông và hình chữ nhật. Ai cũng biết hình vuông là hình chữ nhật có 2 cạnh bằng nhau, do đó ta có thể cho class Square kế thừa class Rectangle để tái sử dụng code.
Do hình vuông có 2 cạnh bằng nhau, mỗi khi set độ dài 1 cạnh thì ta set luôn độ dài của cạnh còn lại. Tuy nhiên, khi chạy thử, hành động này đã thay đổi hành vi của của class Rectangle, dẫn đến vi phạm LSP.
Trong trường hợp này, để code không vi phạm LSP, ta phải tạo 1 class cha là class Shape, sau đó cho Square và Rectangle kế thừa class Shape này.

- Interface segregation principle
Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể.

Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100 methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method. Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc implement và quản lý sẽ dễ hơn.

- Dependency inversion principle
+ Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
+ Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại. (Các class giao tiếp với nhau thông qua interface, không phải thông qua implementation)

Chúng ta đều biết 2 loại đèn: đèn tròn và đèn huỳnh quang. Chúng cùng có đuôi tròn, do đó ta có thể thay thế đèn tròn bằng đèn huỳnh quanh cho nhau 1 cách dễ dàng.
Ở đây, interface chính là đuôi tròn, implementation là bóng đèn tròn và bóng đèn huỳnh quang. Ta có thể swap dễ dàng giữa 2 loại bóng vì ổ điện chỉ quan tâm tới interface (đuôi tròn), không quan tâm tới implementation.

 

 Trong C# mỗi khi bạn sửa đổi một String kết quả đều tạo ra một đối tượng String mới. Trong khi đó StringBuilder chứa trong nó một mảng các ký tự, mảng này sẽ tự động thay thế bởi một mảng lớn hơn nếu thấy cần thiết, và copy các ký tự ở mảng cũ sang.


Nếu bạn phải thao tác ghép chuỗi nhiều lần thì bạn nên sử dụng StringBuilder, nó giúp làm tăng hiệu năng của chương trình.
Tuy nhiên nếu chỉ ghép nối một vài chuỗi thì điều đó không cần thiết, bạn không nên lạm dụng StringBuilder trong trường hợp đó.

So sánh String và StringBuilder:

- String là một đối tượng kiểu immutable (bất biến) và sealed (bị niêm phong, không có khả năng tạo ra kế thừa), nghĩa là khi bạn tạo mới một đối tượng, các giá trị của đối tượng này hoàn toàn không thể thay đổi.
Sự thay đổi giá trị của String nếu diễn ra sẽ diễn ra trên một đối tượng mới.

- StringBuilder dùng một mảng char để lưu trữ các dữ liệu.
StringBuilder được tổ chức như một danh sách liên kết, do đó việc thao tác chuỗi cơ bản như chèn, xóa, cắt, tìm kiếm chuỗi… sẽ là những thao tác trên danh sách liên kết.
StringBuilder cũng có giới hạn sức chứa dữ liệu.

Khi nào nên dùng?
- Khi muốn tối ưu hiệu năng trong quá trình xử lý chuỗi, StringBuilder tỏ ra vượt trội hơn so với String khi nghiệp vụ bạn đang xử lí đòi hỏi việc thao tác chuỗi mà giá trị chuỗi biến động với số lượng lớn.
- Tuy nhiên StringBuilder không hỗ trợ vấn đề thao tác chuỗi mạnh mẽ như String, như nhiều toán tử thao tác như +, +=, =, … cũng như các phương thức như Contains, ToList, ToArray, ...
- Nếu nghiệp vụ bạn đang xử lí yêu cầu việc thao tác chuỗi mà giá trị của chuỗi biến động ít, String hoàn toàn là sự lựa chọn hợp lí bởi sự hỗ trợ đa dạng và đầy đủ các toán tử thao tác chuỗi và phương thức tích hợp đi kèm và cả tốc độ lập trình.

 Vấn đề bảo toàn dữ liệu khi dùng thread là rất quan trọng vì có thể gây ra những sai sót khi nhiều thread cùng thay đổi cùng dữ liệu tại một thời điểm.

Vì thế .Net cung cấp một số kĩ thuật để đồng bộ việc truy xuất dữ liệu.
Một khi được sử dụng, dữ liệu sẽ bị khóa lại và các thread khác muốn sử dụng phải chờ cho đến khi dữ liệu hay tài nguyên được giải phóng.

lock (syncObject){
    // …
}

Tham số sử dụng cho từ khóa lock phải là một đối tượng có kiểu tham chiếu.
Bất kì thread nào sử dụng đối tượng syncObj trên để đồng bộ hóa thông qua lock đều phải chờ cho đến khi đối tượng này được giải phóng.
Nếu có nhiều thread cùng chờ, chúng sẽ được đặt trong một danh sách kiểu queue (FIFO - First In First Out) để được xử lý theo thứ tự.


Deadlock
Đồng bộ hóa khi sử dụng thread là một công việc cần thiết, tuy nhiên nếu không cẩn thận bạn sẽ gặp phải tình trạng chương trình dừng hoạt động vô thời hạn.
Tình trạng này được đặt tên là deadlock. Deadlock xảy ra khi có ít nhất hai thread cùng đợi thread kia giải phóng, thật “trùng hợp” là cả hai lại đang giữ “chìa khóa” của nhau.

 Trong .NET đưa ra một interface có tên là IDisposable (System.IDisposable).

Interface này chỉ có định nghĩa một phương thức Dispose();

Các lớp triển khai interface này chỉ việc định nghĩa nội dung phương thức này để giải phóng các tài nguyên chiếm giữ - khi đối tượng bị hủy.

Tại sao cần tự giải phóng tài nguyên?
Trong .NET hầu hết các loại tài nguyên là được quản lý bởi CLR của hệ thống .NET, nên các tài nguyên, đối tượng không còn tham chiếu đến nó sẽ tự động được CLR thu hồi (GC). Đó là những tài nguyên quản lý được bởi .NET CLR.
Tuy nhiên, vẫn có những loại tài nguyên mà CLR .NET không quản lý được như mở file,  stream file và các kết nối mạng hay kết nối đến database.
Với những loại tài nguyên này dotnet không tự giải phóng nó thế nào, nên bạn phải có một cơ chế chủ động làm việc này khi không còn dùng đến nữa.

Khi một lớp nào đó, triển khai giao diện IDisposable thì có thể dùng với using.
Hết lệnh using đối tượng sẽ tự động được gọi Dispose.

 Bạn cần biết rằng trong C# biến được lưu trữ qua hai cách là Stack và Heap.

Stack dùng tham số (parameters) và địa chỉ biến, hoặc thêm một số thông tin khác. Nó thường dùng cho Value Types - một kiểu tham trị lưu trữ dữ liệu trong không gian bộ nhớ của riêng nó.
Ngược lại Heap được dùng lưu trữ các đối tượng của Reference Types - một kiểu tham chiếu chứa một con trỏ đến một vị trí bộ nhớ chứa dữ liệu.

So sánh struct và class

Giống nhau
- Đều chứa các phương thức (method) và các thuộc tính (Property).
- Đều có thể thực hiện các giao diện (implement interface)
- Đều có hàm khởi tạo

Struct
- Kiểu tham trị
- Không có Destructor
- Không thể khai báo Constructor  không có đối số
- Không có khả năng kế thừa

Class
- Kiểu tham chiếu
- Có Destructor
- Có thể khai báo constructor mặc định không tham số
- Có thể kế thừa

 Từ khóa Virtual hoặc Abstract (bên lớp cha) và Override (bên lớp con) hỗ trợ tạo đa hình (Polymorphism) cho các phương thức (Method) của object.

Phương thức của lớp cha sử dụng với từ khóa Virtual hoặc Abstract, tạo phương thức cùng tên ở lớp con với Override.

Khác biệt giữa Virtual và Abstract:
- Virtual cho phép lớp Con không nhất thiết phải tạo Override cho method Virtual ở lớp Cha. Ngược lại Abstract thì bắt buộc.
- Virtual cho phép lớp Con không nhất thiết phải tạo Override cho method Virtual ở lớp Cha. Ngược lại Abstract thì bắt buộc.
- Method Abstract phải nằm trong class Abstract.
Bài đăng mới hơn Bài đăng cũ hơn Trang chủ

ABOUT AUTHOR

NTechDevelopers

Follow us

New technology for developers

POPULAR POSTS

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...
  • Interview notes: Senior Dot Net (Ver 05/2022)
     - Giới thiệu về bản thân - Nói sơ lược về công nghệ của dự án gần nhất? - So sánh Net Framwork và Net Core? - Net core 3.1 có gì khác biệt ...
  • Interview notes: Junior DotNet (Ver 10/2019)
      1. Bài test: 30 phút Gồm 4 phần: OOP Data structure Database Design pattern 1.1 – Câu hỏi trắc nghiệm liên quan đến 4 thuộc tính 5 câu – C...

Categories

  • Concurrency
  • Database
  • Design Patterns
  • DotNet
  • Entity Framework
  • Frontend
  • Interview notes
  • OOP
  • Principles
  • Subversion Control
  • Unit test

Advertisement

Website đang trong quá trình cập nhập. Hi vọng các bạn ủng hộ!

About Me

NTechDevelopers is a community of Software development joined together with certain common goals: to learn, to teach and to have fun programming. I hope that you find NTechDevelopers to be a wealth of information and a valuable resource.

Popular Posts

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...

Advertisement

Copyright © 2022 Interview Notes. Created by NtechDevelopers