PDA

View Full Version : [JX] Đề nghị viết script điều kiện IF dạng phẳng



invalidpw
29-01-13, 04:14 PM
Khi mọi người viết script kiểm tra nhiều ràng buộc thì hay viết kiểu nhiều hàm IF lồng nhau. Cách viết này làm script phân thành nhiều cấp, code thụt hàng vào trong liên tục gây khó khăn khi đọc script.
Bài này tui muốn đề nghị mọi người khi viết script dùng IF thì tránh viết lồng nhau mà hãy viết dạng phẳng để dễ đọc hơn. Tui xin minh họa như sau:

Ví dụ: Viết script kiểm tra xem có đủ 3 viên Thủy tinh hay không trước khi cho phép tẩy tủy.

Script IF dạng lồng nhau


01 function kiemtra()
02 if GetItemCount(17) >= 1 then
03 if GetItemCount(18) >= 1 then
04 if GetItemCount(19) >= 1 then
05 DelItem(17)
06 DelItem(18)
07 DelItem(19)
08 taytuy()
09 else
10 Talk(1, "", "Không có Tử Thủy Tinh")
11 end
12 else
13 Talk(1, "", "Không có Lục Thủy Tinh")
14 end
15 else
16 Talk(1, "", "Không có Lam Thủy Tinh")
17 end
18 end

Script IF dạng phẳng


01 function kiemtra()
02 if GetItemCount(17) == 0 then
03 Talk(1, "", "Không có Lam Thủy Tinh")
04 return
05 end
06 if GetItemCount(18) == 0 then
07 Talk(1, "", "Không có Lục Thủy Tinh")
08 return
09 end
10 if GetItemCount(19) == 0 then
11 Talk(1, "", "Không có Tử Thủy Tinh")
12 return
13 end
14 DelItem(17)
15 DelItem(18)
16 DelItem(19)
17 taytuy()
18 end


Xin cám ơn ! :)

Edward_Newgate
29-01-13, 05:57 PM
Mình viết hầu như chả tab gì hoặc chỉ tab 1 lần thôi, miễn sao nhìn gọn mắt là được. Nhiều khi đọc script mà thụt tít vào trong mất công xóa khổ vãi.

vipbk
29-01-13, 06:04 PM
ở đây là check từng item thì nên làm theo cách dưới gọn hơn, còn với vòng lặp lồng thì phải dùng cách trên

ví dụ:


for i=1,a do
for j=1,b do
for k=1,c do
...
end
end
end

invalidpw
30-01-13, 04:18 AM
1 số người viết a ma tơ, nhìn rối cả mắt
Script trên sai cmnr

Tại lồng nhau nhiều quá code nó cứ thụt ra thụt vào, code dài đọc một hồi không biết đang trong chỗ nào. Tốt nhất là viết phẳng như trên để khỏi thụt vào.
Script trên chạy đúng nhé, return sẽ thoát hẳn ra khỏi function luôn nên mỗi điều kiện IF là độc lập nhưng nối tiếp nhau, vì vậy dùng END chứ không dùng ELSEIF, để nhìn cho nó độc lập (à có cái dấu >= bị gõ nhầm, đã sửa lại)

greentears
30-01-13, 06:30 AM
cái này tùy ng thôi, có ng thích kiểu này, có ng thích kiểu kia, còn tùy vào trình nữa, đâu phải ai cũng là pro để viết bằng cách tối ưu nhất, gọn gàng nhất đâu :ar!

Bi_Dep_Trai
30-01-13, 07:59 PM
01 function kiemtra()
02 if GetItemCount(17) == 0 then
03 Talk(1, "", "Không có Lam Thủy Tinh")
04 return
05 end
06 if GetItemCount(18) == 0 then
07 Talk(1, "", "Không có Lục Thủy Tinh")
08 return
09 end
10 if GetItemCount(19) == 0 then
11 Talk(1, "", "Không có Tử Thủy Tinh")
12 return
13 end
14 DelItem(17)
15 DelItem(18)
16 DelItem(19)
17 taytuy()
18 end

ở đó là 1 mới đúng chứ

Edward_Newgate
31-01-13, 12:48 PM
01 function kiemtra()
02 if GetItemCount(17) == 0 then
03 Talk(1, "", "Không có Lam Thủy Tinh")
04 return
05 end
06 if GetItemCount(18) == 0 then
07 Talk(1, "", "Không có Lục Thủy Tinh")
08 return
09 end
10 if GetItemCount(19) == 0 then
11 Talk(1, "", "Không có Tử Thủy Tinh")
12 return
13 end
14 DelItem(17)
15 DelItem(18)
16 DelItem(19)
17 taytuy()
18 end

ở đó là 1 mới đúng chứ

= 1 mà lại bảo là không có thủy tinh à =.=!
Đọc lại script đi chứ

loianhhua003
01-02-13, 12:39 PM
viết script là phải có tab như vậy mới đảm bảo đúng nguyên tắc , nó giúp người đọc dễ hiễu hơn và khi muốn chỉnh sữa thì chỉnh sữa cũng dễ hơn , tránh trường hợp sai A mà sữa cả A và B cho dù A và B không liên quan nhau

Romeo8x
09-10-15, 05:29 AM
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

Thứ 2 nữa là nếu các bạn học lập trình các bạn sẽ hiểu tiến trình xử lý code của máy, nếu mà là 1 dạng lồng thì máy tính sẽ phải xử lý nhiều hơn dẫn đến tình trang lag (server online) và nữa là nhìn rất rối mắt. Cho nên nếu có thể đưa về dạng đơn giản nhất thì nên đưa, nó có rất nhiều lợi ích.

Thứ 3 là không phải cứ có ý tưởng là viết ra cái đoạn code tràng giang đại hải, nhiều khi thừa, nếu có thể hãy tìm cách tối ưu code tốt nhất. Đó là kinh nghiệm khi làm code bất cứ game hay phần mềm nào của mình, nếu bản thân hoặc người khác đọc sẽ cảm thấy rất dễ hiểu, ngắn gọn, xúc tích và tối ưu :Laluot_96:

Ví dụ: bạn so sánh 2 đoạn code dưới đây xem cái nào tối ưu và dễ hiểu hơn
Code 1:

function addSkill90(nMp)
local Tab_KyNang90 = {
{"ThiÕu L©m",21,23,24},
{"Thiªn V­¬ng",51,54,56},
{"§­êng M«n",78,80,82},
{"Ngò §éc",103,105,107},
{"Nga My",127,130,132},
{"Thóy Yªn",148,150},
{"C¸i Bang",165,168},
{"Thiªn NhÉn",185,186,188},
{"Vâ §ang",202,203},
{"C«n L«n",224,226,228}
}
if nMp > 0 and nMp < 11 then
nSk = getn(Tab_KyNang90[nMp])
if nSk == 3 then
AddMagic(Tab_KyNang90[nMp][2],20)
AddMagic(Tab_KyNang90[nMp][3],20)
Msg2Player("B¹n häc ®­îc kü n¨ng 90 <color=green>"..Tab_KyNang90[nMp][1].."<color>")
elseif nSk == 4 then
AddMagic(Tab_KyNang90[nMp][2],20)
AddMagic(Tab_KyNang90[nMp][3],20)
AddMagic(Tab_KyNang90[nMp][4],20)
Msg2Player("B¹n häc ®­îc kü n¨ng 90 <color=green>"..Tab_KyNang90[nMp][1].."<color>")
end
end
end

Code 2:

function skill_90x(sel)
local mp = tenmonphai(sel)
if mp == "Thieu Lam Phai" then
AddMagic(21,20)
AddMagic(23,20)
AddMagic(24,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Thien Vuong Bang" then
AddMagic(51,20)
AddMagic(54,20)
AddMagic(56,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Duong Mon" then
AddMagic(78,20)
AddMagic(80,20)
AddMagic(82,20)
AddMagic(83,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Ngu Doc Giao" then
AddMagic(103,20)
AddMagic(105,20)
AddMagic(107,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Nga My Phai" then
AddMagic(127,20)
AddMagic(130,20)
AddMagic(132,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Thuy Yen Mon" then
AddMagic(148,20)
AddMagic(150,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Cai Bang" then
AddMagic(165,20)
AddMagic(168,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Thien Nhan Giao" then
AddMagic(185,20)
AddMagic(186,20)
AddMagic(188,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Vo Dang Phai" then
AddMagic(202,20)
AddMagic(203,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
elseif mp == "Con Lon Phai" then
AddMagic(224,20)
AddMagic(226,20)
AddMagic(228,20)
Talk(1,"no","Chóc mõng b¹n ®· häc ®­îc tuyÖt kü 90 cña "..mp)
end
end

Cùng là đoạn code học skill 90 của các môn phái, nhưng nhìn vào là biết cái nào tối ưu hơn rồi.
Đó là lý do mà script của các bạn có khi lên tới cả 1000 dòng, trong khi tối ưu có thể giảm xuống rất nhiều các đoạn code bị lặp.

Thực ra đoạn Code 1 còn có thể tối ưu hơn nữa nếu thay đoạn IF:

if nMp > 0 and nMp < 11 then
nSk = getn(Tab_KyNang90[nMp])
if nSk == 3 then
AddMagic(Tab_KyNang90[nMp][2],20)
AddMagic(Tab_KyNang90[nMp][3],20)
Msg2Player("B¹n häc ®­îc kü n¨ng 90 <color=green>"..Tab_KyNang90[nMp][1].."<color>")
elseif nSk == 4 then
AddMagic(Tab_KyNang90[nMp][2],20)
AddMagic(Tab_KyNang90[nMp][3],20)
AddMagic(Tab_KyNang90[nMp][4],20)
Msg2Player("B¹n häc ®­îc kü n¨ng 90 <color=green>"..Tab_KyNang90[nMp][1].."<color>")
end
end
Bằng đoạn này:

if nMp > 0 and nMp < 11 then
nSk = getn(Tab_KyNang90[nMp])
for i=2,nSk do
AddMagic(Tab_KyNang90[nMp][i],20)
end
Msg2Player("B¹n häc ®­îc kü n¨ng 90 <color=green>"..Tab_KyNang90[nMp][1].."<color>")
end

dungtnut
21-11-15, 09:29 PM
Khi mọi người viết script kiểm tra nhiều ràng buộc thì hay viết kiểu nhiều hàm IF lồng nhau. Cách viết này làm script phân thành nhiều cấp, code thụt hàng vào trong liên tục gây khó khăn khi đọc script.
Bài này tui muốn đề nghị mọi người khi viết script dùng IF thì tránh viết lồng nhau mà hãy viết dạng phẳng để dễ đọc hơn. Tui xin minh họa như sau:

Ví dụ: Viết script kiểm tra xem có đủ 3 viên Thủy tinh hay không trước khi cho phép tẩy tủy.

Script IF dạng lồng nhau


01 function kiemtra()
02 if GetItemCount(17) >= 1 then
03 if GetItemCount(18) >= 1 then
04 if GetItemCount(19) >= 1 then
05 DelItem(17)
06 DelItem(18)
07 DelItem(19)
08 taytuy()
09 else
10 Talk(1, "", "Không có Tử Thủy Tinh")
11 end
12 else
13 Talk(1, "", "Không có Lục Thủy Tinh")
14 end
15 else
16 Talk(1, "", "Không có Lam Thủy Tinh")
17 end
18 end

Script IF dạng phẳng


01 function kiemtra()
02 if GetItemCount(17) == 0 then
03 Talk(1, "", "Không có Lam Thủy Tinh")
04 return
05 end
06 if GetItemCount(18) == 0 then
07 Talk(1, "", "Không có Lục Thủy Tinh")
08 return
09 end
10 if GetItemCount(19) == 0 then
11 Talk(1, "", "Không có Tử Thủy Tinh")
12 return
13 end
14 DelItem(17)
15 DelItem(18)
16 DelItem(19)
17 taytuy()
18 end


Xin cám ơn ! :)

Người viết script chỉ cần họ dễ nhìn là được, đâu nhất thiết người đọc phải dễ đọc đâu. Người làm thì bỏ công sức ra để làm, người dùng thì mỗi người 1 ý, giả sử mai kia có người đề nghị viết IF lồng nhau cho dễ nhìn thì sao? Hãy cố gắng hiểu người viết muốn làm gì, chứ đừng đòi hỏi họ phải làm gì, trừ khi là đặt hàng họ làm theo ý!

BladeKnight109
21-11-15, 10:49 PM
Viết sao cũng được, mỗi người mỗi khác. nhưng cái chính là tối ưu nhất. Còn gọn gàng hay ko ko quan trọng. Mà nếu được thế thì tốt. Nếu có bàn giao project cho người khác, thì nhìn vào cũng dễ hơn.