[AMX] Coding Style

  • Thread starter Thread starter sontung0
  • Ngày gửi Ngày gửi

sontung0

Dragon Quest
Sếp để Topic sống vài ngày rồi chuyển vào Topic [AMX] Tổng hợp Code, Plug do Mem chế hoặc giới thiệu cũng được ^^


Coding Style

Mở đầu
Đú theo phong trào hoc amx, hôm nay tí tởn post 1 bài hướng dẫn nhỏ nhỏ :)
Mình xin nói luôn là cái hướng dẫn này sẽ không giúp nâng cao trình độ AMX code của bạn đâu ;))

+ Vậy Coding Style nó là cái gì?
- Coding Style hiểu tàm tạm là Phong cách viết code, nghĩa là viết code theo một quy tắc nào đó.
+ Hic.Học code đã bao thứ, giờ lại thêm cả cái gọi là phong cách viết code, viết code mà cũng phải có phong cách cơ à (ăn chơi nhỉ =)))
- Đúng là mới đầu nghe thì cũng có vẻ hơi thừa.Nhưng khi bạn tìm hiểu thì sẽ thấy nó thực sự là có ích.Coding Style được áp dụng hầu hết cho các ngôn ngữ lập trình.vì vậy bỏ ra 1 time tìm hiểu về nó cũng không phải là phí phạm ;)
Giờ đi vào chủ đề chính nào \:D/


The Opening Comment Block
Cái này tạm hiểu là lời giới thiệu về plugin.Nếu để ý thì các bạn sẽ thấy ở ngay đầu của 1 plugin thì thường có 1 đống comment.Nó có cấu trúc như này
[spoil]
PHP:
/*

Copyleft 2011
Plugin thread: http://forum.gamevn.com/forumdisplay.php?75-Counter-Strike

Tên Plugin
========

Description
Đây là nới viết những thông tin chung về plugin
...

Commands
Những command sử dụng trong plugin và tác dụng của chúng
VD:
say /give_weapon - give weapon to player
....

Credits
Tên những người thực hiện plugin
VD:
sontung0 - Author
sontung0 - Testing help
^^

Changelog:
Những cập nhật mới cũng như lỗi bug đã sửa
    Jun 1, 2008 - v1.0 -    Initial release
    Jun 2, 2008 - v1.1 -    [FIXED] Some repeated variables
                [FIXED] Message printing incorrectly
                duelists <-> players
                [ADDED] God mode to normal players

*/
[/spoil]
Và nhiệm vụ của nó là giúp cho người khác khi muốn tim hiểu plugin của bạn thì chỉ cần đọc mục này là sẽ hiểu được


Variables Name
Cái này tạm hiểu là cách đặt tên biến
Cách đặt tên biến thì nên thêm kí tự đại diện cho loại cũng như tính chất của biến vào đầu biến.Đối với tên biến gồm nhiều từ thì chữ cái đầu nên viết hoa

Global Variables (Biến toàn cục - tức là các biến sử dụng ở mọi vị trí)
Thêm kí tự g_ hc g vào đầu
PHP:
new gMyVariable
new g_MyOtherVariable
Tương tự với dạng khác
  • i - integers/cells
  • f hoặc fl - floats
  • s hoặc st - strings
  • b - bools
  • v - vectors
PHP:
// a global cell
new g_iKills

// a global float
new Float:g_flSpeed

// a string
new sMyString[]

// a bool
new bool:bFlag

// a vectors
new vMyVector[3]
Nào bây giờ xem thử tác dụng của em nó xem ntn
VD khi bạn nhìn thấy 1 biến là g_iData.Theo những gì bên trên thì biến này sẽ là biến toàn cục (g_) và nó có dạng integer (i), đỡ phải tìm nơi khai báo biến và biết luôn dạng của biến, cũng đại tiện đúng không ;))

Use Constants
Đối với những hằng số thì bạn nên viết hoa tên biến
PHP:
#define MAX_ITEMS 10
Không nên viết như này
PHP:
#define max_items 10


Functions Name
Tương tự như Variables Name, Functions Name là cách đặt tên cho các function

Public Function (function mà mình đăng kí cho các event, logevent, forward, HamForward, ...)
Cách đặt tên là: <Loại>_<Tên> hc <Loại><Tên>
PHP:
register_event( "HLTV", "EventHLTV", "a", "1=0", "2=0" ) // EventHLTV
register_logevent( "LogEventRoundEnd", 2, "1=Round_End" ) // LogEventRoundEnd
register_forward( FM_PlayerPostThink, "ForwardPlayerPostThink" ) // ForwardPlayerPostThink
register_clcmd( "primammo", "CmdPrimAmmo" ) // CmdPrimAmmo
RegisterHam( Ham_Spawn, "player", "HamSpawn", 1 ) // HamSpawn
hoặc
PHP:
register_event( "HLTV", "Event_HLTV", "a", "1=0", "2=0" ) // Event_HLTV
register_logevent( "LogEvent_RoundEnd", 2, "1=Round_End" ) // LogEvent_RoundEnd
register_forward( FM_PlayerPostThink, "Forward_PlayerPostThink" ) // Forward_PlayerPostThink
register_clcmd( "primammo", "Cmd_PrimAmmo" ) // Cmd_PrimAmmo
RegisterHam( Ham_Spawn, "player", "Ham_Spawn", 1 ) // Ham_Spawn
(cá nhân mình thì thích cách 2 hơn ;;))

Stock Function, Function (chính là các function mà mình tạo)
Cách đặt tên là: <công_dụng>_<Tên> hc <công_dụng><Tên>

Đối với hàm lấy giá trị thì tiếp đầu ngữ là get
Đối với hàm lấy giá trị mà giá trị trả về là Boolean thì tiếp đầu ngữ là:
  • is - nếu theo sau là tính từ
  • has - nếu sau là danh từ
  • can - nếu sau là động từ
Đối với các hàm setter (hàm làm thay đổi giá trị của cái gì đó) thì tiếp đầu ngữ là set
PHP:
getUserName()
isUserAlive()
hasWeapon()
canDropWeapon()
setUserHealth()


Indentation, Tabbing và Spacing
Cái này nghĩa là sử dụng Tab, Spacing trong những câu lệnh để tạo các khoảng rõ ràng trong code
Để hiểu rõ thì các bạn xem 2 VD sau:
PHP:
public some_function(id){
new szVariable[10]
format(szVariable,9,"hello!!!!")
if(id==0){
server_print(szVariable)
}else{
client_print(id,print_chat,szVariable)
}
return PLUGIN_HANDLED
}
PHP:
public some_function( id )
{
    new szVariable[10];
    format( szVariable, 9, "hello!!!!" );

    if ( id == 0 )
    {
        server_print( szVariable );
    }
    else
    {
        client_print( id, print_chat, szVariable );
    }

    return PLUGIN_HANDLED;
}
rõ ràng là với cách thứ 2 thì code khi nhìn vào sẽ dễ nhìn, dễ đọc và dễ chỉnh sửa hơn đúng không.
Dưới đây là các cách viết code sử dụng Indentation, Tabbing và Spacing
[spoil]
PHP:
// public function
public FunctionName( param1, param2, param3 )
{
	// code here...
}

// function
FunctionName( param1, param2, param3 )
{
	// code here...
}

// if else
if ( iparam1 == 0 || param2 > 0 || ( param3 - param4 > 0 ) )
{
	// code here...
}
else
{
	// code here...
}

// for
for ( new i; j < 100; j++ )
{
	// code here
}

// switch
switch( variable )
{
	case 0:
	{
		// code here
	}
	default:
	{
		// code here
	}
}

// while
while( Function() )
{
	// code here
}

// do while
do
{
	//this code will be executed at least once, and more until Function() returns false
}
while( Function() )

// array
new gCosts[MAX_WEAPONS] = 
{
	2750,
	300,
	3000
}
new gSounds[SOUNDS][] =
{
	"items/suitchargeno1.wav",
	"cstactics/commander_attack.wav",
	"cstactics/commander_defend.wav"
}

// enum
enum ORDERS
{
	NONE,
	ATTACK,
	DEFEND,
	EQUIP
}
[/spoil]


Commenting
Cuối cùng là phần chú thích cho code (comment)
Khi viết code thì các bạn đừng tiếc những dòng comment, comment mọi lúc mọi nơi nếu thấy cần thiết.
Những dòng comment đó sẽ giúp ích rất nhiều khi bạn sửa code sau 1 time hoặc giúp những người khác hiểu code của bạn nhanh hơn

Trước mỗi function hoặc biến thì nên có những comment ghi rõ tác dụng, tham số và giá trị trả về của nó
PHP:
/**
 * Returns a single cell of data from an array.  
 * Use this only with arrays that were created with a cellsize of 1!
 *
 * @param which		The array to retrieve the item from.
 * @param item			The item to retrieve (zero-based).
 * @return				The value of the cell.
 */
native any:ArrayGetCell(Array:which, item);


Lời kết
Viết code thì mỗi người một phong cách, một thói quen.Không thể gò bó tất cả mọi người viết code theo một cách nhất định được.
Ngay cả mình cũng vậy, không phải khi viết code là mình làm theo tất cả những quy tắc trên
Coding Style nhằm hướng cho Coder viết code theo một cách có hệ thống và có tổ chức
Và mục đích cuối cùng là giúp cho code khi nhìn vào sẽ Dễ Đọc -> Dễ Hiểu -> Dễ Chỉnh Sửa

Tài liệu:
http://forums.alliedmods.net/showthread.php?t=6481
http://forums.alliedmods.net/showthread.php?t=85274

Trình độ có hạn, trong bài viết có gì thiếu hay sai sót thì mọi người cứ gạch thoải mái \:D/
Giờ mới để ý đây là bài viết thứ 1000 của mình, đẹp ;))
 
Chỉnh sửa cuối:
Sếp để Topic sống vài ngày rồi chuyển vào Topic [AMX] Tổng hợp Code, Plug do Mem chế hoặc giới thiệu cũng được ^^

hay lắm!
bảo kê topic này. anh em thảo luận, hạn chế những post có nội dung không liên quan nhé :D
 
Cái này giúp mình trình bày code 1 cách dễ dàng, dễ hiểu hơn. Khá hay
 
Mà chủ yếu là tự người viết đặt ra và theo ý họ thôi (nói cách khác, nếu họ ko muốn public thì việc đặt style của họ cũng cần 1 thời gian mới quen đc)
những người mới bắt đầu viết nên đặt sao cho dễ hiểu (lỗi học coder âầu tiên của mình =.='). viết lộn xộn. giờ vào v1.3 đọc chưa chắc đã hiểu đc 1/3 những j mình đã từng viết 8-}
~> newbie cứ theo đó cho dễ đã. go pro rồi đặt sao chả đc >:)
 
:|
đọc mà cũng chỉ hiểu dc 1/5 :|
mà theo mọi người học code thì nên học gì trước nhỉ =-=!
 
Hay lắm, nhưng mình còn một lưu ý là khi thụt đầu dòng k đúng (hay còn gọi là tabbing) thì complier nó sẽ warning luôn, chứ k phải là thế nào cũng đc (đang nói về amx complier :)))
@Sếp: E nghĩ nên lấy topic này làm topic thảo luận về amx luôn cũng đc (Có thể đổi tên khác), còn topic kia chỉ để trưng bày plugin thôi :)) :D
 
Chỉnh sửa cuối:
Ở trên Off-topic của AM có 1 cái thread trò chơi thư giãn là : Đưa 1 đoạn code ra cho mọi người đoán coding style --> người viết code.. Qua cái coding style này cũng phần nào giúp nhận ra được kiểu viết code của 1 scripter nào đó....
Viết code nhiều dần dần sẽ tự dưng hình thành kiểu style riêng thôi.
 
Ở trên Off-topic của AM có 1 cái thread trò chơi thư giãn là : Đưa 1 đoạn code ra cho mọi người đoán coding style --> người viết code.. Qua cái coding style này cũng phần nào giúp nhận ra được kiểu viết code của 1 scripter nào đó....
Viết code nhiều dần dần sẽ tự dưng hình thành kiểu style riêng thôi.
AM nó chuyên về viết code r`, coder nó toàn chuyên nghiệp cả, đương nhiên sẽ có 1 style riêng. Còn 4rum mình chỉ toàn coder nghiệp dư(trừ 1 vài người giỏi) thì lấy đâu ra style riêng mà đoán. :))
 
Thì ta đã nói là cứ viết nhiều rồi sẽ hình thành style ^:)^.. Không phải cứ chuyên nghiệp thì mới có style ^:)^.
 
Thì ta đã nói là cứ viết nhiều rồi sẽ hình thành style ^:)^.. Không phải cứ chuyên nghiệp thì mới có style ^:)^.
Viết nhiều mà toàn viết vớ vẩn chưa chắc đã thành style đâu.
Mà thôi, spam sếp lại chém, hỏi anh Tùng cái này:
Mấy cái spr thế này thì anh làm sao đưa nó vào đúng vị trí đc nhỉ, theanh bảo k thể đặt tọa độ theo chiều ngang cho spr mà ??
untitled-4.jpg
 
Viết nhiều mà toàn viết vớ vẩn chưa chắc đã thành style đâu.
Mà thôi, spam sếp lại chém, hỏi anh Tùng cái này:
Mấy cái spr thế này thì anh làm sao đưa nó vào đúng vị trí đc nhỉ, theanh bảo k thể đặt tọa độ theo chiều ngang cho spr mà ??
untitled-4.jpg

Lấy tọa độ từng cái thì bên Sprite có nói rồi, còn vị trí trên màn hình thì cố định luôn rồi. Có gì qua Sprite hỏi, ở đây dễ ăn thẻ :))
 
Nếu là sprites và hud của CSO thì tìm ngay cái hud.txt nguyên của CSO có ghi sẵn cả 4 con số của các spr và hud trong ấy luôn :|
 
Nếu là sprites và hud của CSO thì tìm ngay cái hud.txt nguyên của CSO có ghi sẵn cả 4 con số của các spr và hud trong ấy luôn :|
Biết là thế r`, nhưng 4 con số ấy k cho biết đc vị trí spr trên màn hình đâu .
 
Back
Top