XinClipBiBan
Member
10 năm code của tôi chưa thấy cái project nào gọi là dễ maintain cả fence à. Net nhìn chặt chẽ vậy sao lại khó maintain hả bác

10 năm code của tôi chưa thấy cái project nào gọi là dễ maintain cả fence à. Net nhìn chặt chẽ vậy sao lại khó maintain hả bác

Thằng medium.com cũng to đang chạy nodejs làm app chính.
Thích nodejs

- 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?
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?
Xem tệp đính kèm 174796
Vậy cái này là gì vậy anh![]()
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![]()
Đế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ớic# 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.![]()
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![]()
const [head, ...tail] = [1, 2, 3]
const { arg1, arg2 } = args
type Id = string | number
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?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.
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![]()
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?ý 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ả.
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();
}
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ậyThằ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 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 đó.ý 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ả.
