-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat/remove unsafe variables & add data type casting guards #20
base: master
Are you sure you want to change the base?
Conversation
"ezyfox", | ||
"freechat" | ||
] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cần bổ sung dòng trắng
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Anh có comment, tuy nhiên đây là một PR quá lớn, quá nhiều file bị thay đổi, nên sẽ thảo luận rất lâu, có thể mất 1 tuần, 2 tuần để merge được PR này em nhé.
Anh nghĩ lần tới em có thể tạo PR nhỏ hơn nhé.
@thanhdang198 PLTAL
config.clientName = ZONE_NAME; | ||
EzyConfig config = EzyConfig(ZONE_NAME); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Các này có vẻ ngắn hơn nhưng nó lại làm phá vỡ style chung với phần ở dưới ví dụ config.enableSSL
điều này sẽ dẫn đến việc các lập trình viên khác đặt câu hỏi tại sao phải như vậy, do đó vi phạm vào nguyên tắc KISS
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Phần này em có thấy clientName là field khá quan trọng, nhưng lại không required khi tạo class mà phụ thuộc vào việc lấy từ config (cũng là field option) ạ.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clientName
cũng quan trọng tuy nhiên nó có thể lấy từ zoneName
để làm clientName
, ngoài ra nếu em bỏ đi hàm tạo mặc định, thêm hàm tạo có đối số sẽ gây breaking change cho các dự án đang dùng em ạ
late EzyConfig config; | ||
EzyConfig config; | ||
late String name; | ||
late EzyZone? zone; | ||
late EzyUser? me; | ||
EzyZone? zone; | ||
EzyUser? me; | ||
late EzySetup setup; | ||
late EzyHandlerManager handlerManager; | ||
late Uint8List? privateKey; | ||
late int sessionId; | ||
late String? sessionToken; | ||
late Uint8List? sessionKey; | ||
Uint8List? privateKey; | ||
int? sessionId; | ||
String? sessionToken; | ||
Uint8List? sessionKey; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Em có thể giải thích tại sao em lại muốn remove late khỏi một số trường không?
late String defaultClientName; | ||
late Map<String, EzyClient> clients; | ||
String defaultClientName = ""; | ||
Map<String, EzyClient> clients = <String, EzyClient>{}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Em có thể giải thích tại sao em lại muốn remove late khỏi một số trường không?
EzyClient? getClient(String clientName) { | ||
EzyClient? client = clients[clientName]; | ||
return client; | ||
} | ||
|
||
EzyClient getDefaultClient() { | ||
return clients[defaultClientName]!; | ||
EzyClient? getDefaultClient() { | ||
return clients[defaultClientName]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chỗ này không thể thay đổi được vì có thể gây breaking change cho các ứng dụng đang sử dụng, nếu muốn em phải tạo hàm mới để đảm bảo nguyên tắc Open/Close
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chỗ này buộc phải thay đổi, nó có nguy cơ khá lớn nếu không tìm thấy client -> dẫn đến việc EzyClient đang được khai báo là non-null nhưng bị gán null vào -> khả năng phát sinh lỗi.
Chỗ này mình có thể mark deprecated rồi mình thực hiện breaking change cho version sau sẽ ổn hơn ạ.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chỗ này thực ra anh cũng đã từng để EzyClient?
nhưng khi sử dụng cực kỳ bất tiện, vì trong thực tế sử dụng các client sẽ được khởi tạo và được đưa vào quản lý tương ứng với tên và không bao giờ null
, khi sử dụng nếu cứ để ?
thì đầu sử dụng cứ phải thêm !
cũng bất tiện nên anh nghĩ cứ để đó không cần phải deprecated
, có thể tạo thêm hàm ?
cũng không sao.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chỗ này thực ra anh cũng đã từng để
EzyClient?
nhưng khi sử dụng cực kỳ bất tiện, vì trong thực tế sử dụng các client sẽ được khởi tạo và được đưa vào quản lý tương ứng với tên và không bao giờnull
, khi sử dụng nếu cứ để?
thì đầu sử dụng cứ phải thêm!
cũng bất tiện nên anh nghĩ cứ để đó không cần phảideprecated
, có thể tạo thêm hàm?
cũng không sao.
Vậy chỗ này anh đang chấp nhận đánh đổi rủi ro để lấy sự tiện lợi trong quá trình dev ạ?
Em thấy nó không đủ an toàn á anh, đồng thời các biến nullable đều phải có check if(x!=null)
trước thì mới được thêm !
, nếu không nó phải được access bằng x?.y?.z
thay vì x!
luôn ạ.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Anh nghĩ là để EzyClient?
cũng là ý tưởng tốt, tuy nhiên phương thức hiện tại nó đã không để là EzyClient?
rồi giờ sửa trực tiếp sẽ vi phạm nguyên tắc Open/Close không phải là ý hay, anh nghĩ là có thể tạo hàm mới, còn về deprecated thì anh nghĩ cứ để suy nghĩ thêm em ạ.
late String zoneName = ""; | ||
late String clientName; | ||
late bool enableSSL = false; | ||
late bool enableDebug = false; | ||
late EzyPingConfig ping = EzyPingConfig(); | ||
late EzyReconnectConfig reconnect = EzyReconnectConfig(); | ||
|
||
String zoneName = ""; | ||
String clientName; | ||
bool enableSSL = false; | ||
bool enableDebug = false; | ||
EzyPingConfig ping = EzyPingConfig(); | ||
EzyReconnectConfig reconnect = EzyReconnectConfig(); | ||
EzyConfig(this.clientName); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Em có thể giải thích tại sao em lại muốn remove late khỏi một số trường không?
late int id; | ||
late String name; | ||
late EzyClient client; | ||
int id; | ||
String name; | ||
EzyClient client; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tương tự
late int id; | ||
late String name; | ||
late EzyZone zone; | ||
late EzyClient client; | ||
int id; | ||
String name; | ||
EzyZone zone; | ||
EzyClient client; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tương tự
try { | ||
var reason = event["reason"] as int; | ||
var reasonName = | ||
EzyConnectionFailedReasons.getConnectionFailedReasonName(reason); | ||
EzyLogger.warn("connection failure, reason = $reasonName"); | ||
} catch (e) { | ||
EzyLogger.error("error when handle connection failure $e"); | ||
rethrow; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tại sao em lại muốn thêm try catch vào đây?
int? reason; | ||
try { | ||
reason = event["reason"] as int; | ||
var reasonName = EzyDisconnectReasons.getDisconnectReasonName(reason); | ||
EzyLogger.info("handle disconnection, reason = $reasonName"); | ||
} catch (e) { | ||
EzyLogger.error("error when handle disconnection $e"); | ||
rethrow; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tương tự
int? reason; | ||
try { | ||
reason = event["reason"] as int; | ||
} catch (e) { | ||
EzyLogger.error("error when check should reconnect $e"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tương tự
Hi anh @tvd12, cảm ơn anh đã dành thời gian review PR của em ạ.
Đồng thời, em có thấy 1 số giá trị là dynamic data được gán vào 1 số biến được khai báo non-null (không có dấu ? sau kiểu biến, ví dụ Tài liệu null-safety của flutter
Nếu được, anh nên quản lý lib bằng version trên pub.dev để thuận tiện cho việc nâng cấp về sau. |
@thanhdang198 anh sẽ tách ra thành các phần thảo luận riêng nhé.
Ngoài ra các dữ liệu trong handler là do ezyfox-server trả về theo đúng kiểu dữ liệu đó nên không có vấn đề gì về ép kiểu em ạ. |
Em biết việc try-catch exception không tốt cho performance, 1 phần em cũng chưa đọc sâu các đoạn code native, nhưng để đọc code này & tin là chắc chắn không có lỗi trong quá trình runtime thì em không chấp nhận á anh. |
nghĩa là sao nhỉ? anh chưa hiểu ý em câu này |
late
keywords