kiến thức Ưu,nhược điểm của ASP.NET so với NodeJS

  • Người tạo chủ đề Người tạo chủ đề huycon1002
  • Ngày bắt đầu Ngày bắt đầu
cuối cùng cũng đi về chổ "code thối là do dev" thì huề cả làng, hay lại bảo "right tool for right job" thì cũng :beat_brick:

mấy cái lượng hóa được như performance mà để setup được chuẩn cho ra ngô ra khoai còn mệt vãi ra. Nên mấy cái cảm tính như syntax, ecosytem thì còn khuya :go:
 
Thằng medium.com cũng to đang chạy nodejs làm app chính.
Thích nodejs

Thằng medium chả nói chán chệ vụ NodeJS backend bên nó performance thấp và có vấn đề khi các tác vụ nặng của nó làm tăng busy time của event loop làm nghẽn đơ luôn tác vụ khác. Nên tụi nó optimize đủ kiểu: phải chạy multiple instance rồi routing request về instance cụ thể, cô lập các robust job , request luôn . Chạy xuống dưới sâu V8 runtime check nữa kìa :(
 
Sửa lần cuối:
Mà bây giờ thằng nào chẳng áp dụng mô hình microservice nhỉ, quan trọng làm gì, thằng nào phù hợp cho service nào thì dùng ? đúng không ?
 
  • nhưng trong js function là first class citizen còn c# thì không.
  • tooling không hiểu js giờ thiếu cái gì. debug có, IntelliSense có...
  • library cũng không hiểu npm thua nuget ở điểm nào.

chả hiểu đưa cái first class function so sánh với C# để làm gì? Người ta thường dùng js để làm functional programming lắm chăng?
 
chả hiểu đưa cái first class function so sánh với C# để làm gì? Người ta thường dùng js để làm functional programming lắm chăng?

first class function để bạn không phải sử dụng 1 framework để có dependency injection.
để bạn có thể khai báo 1 function trong 1 function, để bạn không phải tạo Action<T>, Func<T>...
 
Typical measures of first-class status include the following:

  • Can you bind functions to identifiers? That is, can you give them names?
  • Can you store functions in data structures, such as in a list?
  • Can you pass a function as an argument in a function call?
  • Can you return a function from a function call?

1598814989602.png


Vậy cái này là gì vậy anh
xjIzSG9.png


Action<T>, Func<T> gì gì đó chỉ để thể hiện cái signature của func, liên quan gì đến first class function, hay ý anh là 1 cái function không có signature muốn pass vào đâu cũng được mới là first class
BdgiW7R.png
 
Sửa lần cuối:
Xem tệp đính kèm 174796

Vậy cái này là gì vậy anh
xjIzSG9.png


Action<T>, Func<T> gì gì đó chỉ để thể hiện cái signature của func, liên quan gì đến first class function, hay ý anh là 1 cái function không có signature muốn pass vào đâu cũng được mới là first class
BdgiW7R.png

c# làm gì có function, nó chỉ có method. trong 1 class nó chia ra 2 loại member là data member và method member. anh không thể truyền thẳng method này vào method khác, mà anh phải tạo 1 data member Func<T> rồi mới truyền vào method được. cái Func<T> là type cho data member anh ạ.

vậy nên khi anh muốn áp dụng DI thì anh phải gói function vào 1 class rồi anh inject cả cái class đó vào chứ không phải anh inject 1 function vào. tương tự như thế khi anh truyền Func<T>, Action<T> vào method là a đang truyền 1 object chứ không phải 1 function. vậy nên nó mới sinh ra framework để DI.

nói tóm lại là vì nó lằng nhằng như thế nên bình thường không ai truyền Func<T> vào method cả (trừ lib như linq) hay trả về 1 Func<T> từ method.
 
Sửa lần cuối:
c# làm gì có function, nó chỉ có method. trong 1 class nó chia ra 2 loại member là data member và method member. anh không thể truyền thẳng method này vào method khác, mà anh phải tạo 1 data member Func<T> rồi mới truyền vào method được. cái Func<T> là type cho data member anh ạ.

vậy nên khi anh muốn áp dụng DI thì anh phải gói function vào 1 class rồi anh inject cả cái class đó vào chứ không phải anh inject 1 function vào. tương tự như thế khi anh truyền Func<T>, Action<T> vào method là a đang truyền 1 object chứ không phải 1 function. vậy nên nó mới sinh ra framework để DI.

nói tóm lại là vì nó lằng nhằng như thế nên bình thường không ai truyền Func<T> vào method cả (trừ lib như linq) hay trả về 1 Func<T> từ method.
Đến h tôi vẫn không hiểu vấn đề của anh là gì, anh có thể cho 1 ví dụ cụ thể (functional) mà C# không làm được mà JS làm được cho tôi mở rộng tầm mắt với
yBBewst.png
.
C# không có function nhưng có static method, import static thì cũng có khác gì đâu. Anh nghĩ tôi không phân biệt function với method khác nhau như nào à mà bày đặt chơi trò con chữ ở đây
gvTwnV8.gif

1598819159914.png

Điểm khác biệt duy nhất ở đây là cú pháp thằng C# có vẻ ngu học hơn mà thôi, nhưng bảo nó không phải first class function thì sai bét
4gmOAMB.png
 
Sửa lần cuối:
Đến h tôi vẫn không hiểu vấn đề của anh là gì, anh có thể cho 1 ví dụ cụ thể (functional) mà C# không làm được mà JS làm được cho tôi mở rộng tầm mắt với
yBBewst.png
.
C# không có function nhưng có static method, import static thì cũng có khác gì đâu. Anh nghĩ tôi không phân biệt function với method khác nhau như nào à mà bày đặt chơi trò con chữ ở đây
gvTwnV8.gif

anh không thể tạo 1 function độc lập mà không có class.

tôi không có ý nói có cái js làm được mà c# không làm được. ý tôi ở đây là có 1 số pattern viết rất tự nhiên nếu có function is first class citizen, c# vẫn làm được nhưng thiếu tự nhiên.

sắp sửa js ra cái pipeline operator không biết c# có làm được không.

ngoài ra còn 1 số thứ nhỏ nhỏ không liên quan tới function is first class citizen mà c# không thể làm được là spread operator

JavaScript:
const [head, ...tail] = [1, 2, 3]
const { arg1, arg2 } = args

hay kiểu dữ liệu union (typescript), do bản chất js là weak typing:

Mã:
type Id = string | number

ngoài ra chắc là còn nhiều thứ nữa nhưng tạm thời tôi chưa nghĩ ra.
 
Sửa lần cuối:
+1 mình đọc cũng ko hiểu vấn đề vấn đề bạn trên gặp là cái gì. Mình cũng ko hiểu truyền function bạn ấy nói là cái gì, trước giờ đều là truyền function pointer, thời C đã là vậy, giờ những cái function signature thông dụng C# nó đã tạo tên riêng, đỡ phải type def, dùng thì có gì khác? DI gói vào 1 class là để dễ tìm dễ quản lý dễ test dễ config. Truyền hay trả về Func tớ vẫn làm bình thường, ai cấm, mọi thứ dùng không khác function pointer từ thời C. Cái khác duy nhất có lẽ chăng là tớ đỡ phải type nhiều, và cái này tớ thích.
 
anh không thể tạo 1 function độc lập mà không có class.

tôi không có ý nói có cái js làm được mà c# không làm được. ý tôi ở đây là có 1 số pattern viết rất tự nhiên nếu có function is first class citizen, c# vẫn làm được nhưng thiếu tự nhiên.

sắp sửa js ra cái pipeline operator không biết c# có làm được không.

ngoài ra còn 1 số thứ nhỏ nhỏ không liên quan tới function is first class citizen mà c# không thể làm được là spread operator

JavaScript:
const [head, ...tail] = [1, 2, 3]
const { arg1, arg2 } = args

hay kiểu dữ liệu union (typescript), do bản chất js là weak typing:

Mã:
type Id = string | number

ngoài ra chắc là còn nhiều thứ nữa nhưng tạm thời tôi chưa nghĩ ra.
Mấy cái đấy người tạo ra C# coi là nhược điểm hơn là ưu điểm. Weak typing = dangerous, cho nên người ta mới phải nghĩ làm sao để có strongly type, cho nên những ngôn ngữ như Java, C# mới ra đời. Tạo function độc lập? Để làm cái gì không biết ngoài 1 đống unmaintainable mess?

Nói chung học ngôn ngữ gì có lẽ nên tìm hiểu concept của ngôn ngữ đã. Thật nếu cần weak typing hay function độc lập ấy, thì đã sẵn từ thời C cần gì phải mất công tạo ra cái mới làm gì.

Cho nên mấy cái nhiều thứ chưa nghĩ ra đấy bạn khỏi mất công nghĩ, bởi C# có thể tương tác trực tiếp với HĐH, cho nên về mặt lý thuyết, các ngôn ngữ khác làm được cái gì thì C# cũng phải làm được cái đấy. Quan trọng là có dễ dàng hay không, có thuận tiện hay không.
 
vậy nên khi anh muốn áp dụng DI thì anh phải gói function vào 1 class rồi anh inject cả cái class đó vào chứ không phải anh inject 1 function vào. tương tự như thế khi anh truyền Func<T>, Action<T> vào method là a đang truyền 1 object chứ không phải 1 function. vậy nên nó mới sinh ra framework để DI.

Nói tầm bậy, bản chất DI từ ban đầu nó không phụ thuộc vào kiểu dữ liệu:baffle:
 
Nói tầm bậy, bản chất DI từ ban đầu nó không phụ thuộc vào kiểu dữ liệu:baffle:

ý tôi là cái function signature anh phải gói trong 1 cái interface vì anh không thể inject trực tiếp được function. xong rồi chính vì thế người ta mới đẻ ra cái quy tắc interface segregation, tức là 1 interface chỉ được chứa 1 method thôi.

còn cái implementation cho cái function signature đó anh cũng phải gói vào 1 cái class.

1 cái nữa là 99% dev đều dùng constructor injection chứ chẳng ai inject trực tiếp vào function cả.
 
ý tôi là cái function signature anh phải gói trong 1 cái interface vì anh không thể inject trực tiếp được function. xong rồi chính vì thế người ta mới đẻ ra cái quy tắc interface segregation, tức là 1 interface chỉ được chứa 1 method thôi.

còn cái implementation cho cái function signature đó anh cũng phải gói vào 1 cái class.

1 cái nữa là 99% dev đều dùng constructor injection chứ chẳng ai inject trực tiếp vào function cả.
Nói nhảm không à. Tớ chưa bao giờ nghe nói cái gọi là inject function. Còn nếu ý bạn đó là function pointer thì có cái quái gì mà không inject được?
C#:
 public class Test
        {
            private readonly Func<int, int> _test;
            public Test(Func<int, int> test) { _test = test; }

            public void StupidTest()
            {
                Console.WriteLine(_test(2));
            }

        }
static void Main(string[] args)
        {
            var test = new Test(m => m*m);
            test.StupidTest();
            //Console.WriteLine(s.NumSub(st));
            Console.ReadLine();
        }

Kết quả ra 4 as expected.

Edit: Đọc lại thấy cái bạn viết về interface segregation tớ tức quá. Nói chung bạn đừng nên viết thêm gì không có ngày tớ đập màn hình mất. Mục đích của interface segregation là để phục vụ cho code reuse. Giờ giả dụ bạn viết 1 interface có 2 methods chẳng hạn, giờ về sau đẻ ra 1 thằng chỉ có nhu cầu sử dụng 1 trong 2 methods nói trên, nếu bạn kế thừa interface đã có thì tự nhiên bạn lại phải implement 1 method rác không sử dụng, rất dở. Còn nếu bạn quyết định viết 1 interface mới chỉ có duy nhất 1 method cần dùng thôi, sẽ dẫn đến 2 interface có 1 method giống hêt nhau. Đấy là duplicate code, thế là code của bạn sẽ ko còn open-closed nữa, nếu có update gì là sẽ phải update ở 2 nơi thay vì lẽ ra chỉ 1. Nếu bạn hiểu concept tại sao, thì những cái đấy nó đến với bạn 1 cách rất tự nhiên bạn thậm chí còn chẳng nhớ tên tự bạn sẽ code thành như vậy. 1 interface có 1 hay nhiều methods là tùy vào cách bạn định reuse nó thế nào, chứ cũng chẳng nhất thiết 1-1.
 
Sửa lần cuối:
Thằng medium chả nói chán chệ vụ NodeJS backend bên nó performance thấp và có vấn đề khi các tác vụ nặng của nó làm tăng busy time của event loop làm nghẽn đơ luôn tác vụ khác. Nên tụi nó optimize đủ kiểu: phải chạy multiple instance rồi routing request về instance cụ thể, cô lập các robust job , request luôn . Chạy xuống dưới sâu V8 runtime check nữa kìa :(
Cái này goi là lấy số lượng bù cho chất lượng, kiểu như làm ngu thì phải làm nhiều vậy
Mấy thằng dev hay xài docker chay php-fpm cũng ngu kiểu vậy, đã docker còn chạy port 9000 tương tác với nginx, dẫn đến là phải mở 1 đống instance dể giải quyết cái tổ chức ngu si từ bạn đầu, và lâu lau tôi nghe ai đó nói là docker giúp tối ưu hiệu năng vì scale linh động, nhưng bản chất là linh động cho cái ngu về tổ chức
 
ý tôi là cái function signature anh phải gói trong 1 cái interface vì anh không thể inject trực tiếp được function. xong rồi chính vì thế người ta mới đẻ ra cái quy tắc interface segregation, tức là 1 interface chỉ được chứa 1 method thôi.

còn cái implementation cho cái function signature đó anh cũng phải gói vào 1 cái class.

1 cái nữa là 99% dev đều dùng constructor injection chứ chẳng ai inject trực tiếp vào function cả.
Cái bạn nói trên nó thuộc về khái niệm Design Pattern của 1 program. Bạn viết nó bằng JS, hay JAVA, hay C# hay cái gì khác đều phải tuân thủ những nguyên tắc này để đảm bảo tính maintainable của program đó.

Còn cụ thể về DI, nếu bạn khẳng định C# không thể inject trực tiếp method mà không cần class hay interface thì tôi có thể demo 1 đoạn code đơn giản để khẳng định điều đó hoàn toàn có thể làm được, Chỉ có điều đối với C# thì phải khai báo kiểu dữ liệu lằng nhằng lúc ban đầu, bù lại việc inject dựa vào kiểu dữ liệu sẽ khiến quá trình resolve dependencies đơn giản hơn nhiều so với JS. :)
 

Thống kê chủ đề

Ngày tạo
huycon1002,
Người trả lời cuối
xuansang999,
Trả lời
174
Lượt xem
44.752
Quay lại
Lên đầu trang