Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > สอบถาม ผลเสียของการ ใช้ตัว แบบ global ใน function เยอะ นะครับ



 

สอบถาม ผลเสียของการ ใช้ตัว แบบ global ใน function เยอะ นะครับ

 



Topic : 030494



โพสกระทู้ ( 581 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook



จากคำถามนะครับ อยากรู้ผลเสียที่มันจะเกิดปัญหานะครับ... เช่น
ผมใช้ $_POST หรือ $_GET ใน function มากเกินนะครับ เลย หนักใจว่า จะมีผลกับการใช้ ในอนาคต



Tag : - - - -







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2009-08-19 11:54:56 By : nilas View : 3292 Reply : 8
 

 

No. 1



โพสกระทู้ ( 5,146 )
บทความ ( 26 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


ถ้าคุณไม่ใช้ นั่นหละ ในอนาคตจะเกิดปัญหา






Date : 2009-08-19 11:58:34 By : deawx
 


 

No. 2



โพสกระทู้ ( 350 )
บทความ ( 0 )



สถานะออฟไลน์


ขอแสดงความคิดเห็นนิดนะคับผมเห็นด้วยอย่างยิ่งกับคุณdeawx
Date : 2009-08-19 12:07:34 By : gofgof
 

 

No. 3



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

ปกติ $_POST หรือ $_GET มันดีกว่าไม่มีน่ะครับ ผมว่าคุณเข้าใจอะไรผิดหรือเปล่าครับ
Date : 2009-08-19 12:17:04 By : webmaster
 


 

No. 4



โพสกระทู้ ( 581 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

งงกับคุณ MR.WIN สรุปแล้ว ใช้เยอะมัน ดีหรือไม่ดี ครับ ผมไม่ได้หมายถึง $_POST หรือ $_GET เท่านั้นทุกอย่างที่ เป็น ตัวแปร Global นะครับ
Date : 2009-08-19 14:28:38 By : nilas
 


 

No. 5



โพสกระทู้ ( 581 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ที่ผมถาม สืบเนื่องมาจาก https://www.thaicreate.com/php/forum/030250.html ความคิดเห็นที่ 12 ที่ คุณ num แสดงความคิดเห็นไว้ นะครับ.. ลองไปอ่านกันดู และ สรุปความคิดเห็นด้วยนะครับ เพื่อนำไปสู่การปฏิบัตืต่อไป....
Date : 2009-08-19 14:48:56 By : nilas
 


 

No. 6



โพสกระทู้ ( 1,463 )
บทความ ( 1 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Blogger

ท่านอื่นๆ คงหมายถึงใช้ตัวแปรโดย register global on ครับ อย่างเช่น $_POST['a']
ซึ่งจะทำให้สามารถใช้ $a แทนได้ ซึ่งจะทำให้เกิดปัญหาแน่ๆ เพราะผู้ใช้สามารถส่งตัวแปรมาเป็นค่าของตัวแปรในโปรแกรม
ทำให้โปรแกรมได้รับผลกระทบ และมีสิทธิล่มได้ง่ายมาก
===============
มาถึงตัวแปร global ที่ผมพูดถึงนะครับ

ในการเขียนโปรแกรมเราเป็นผู้เขียน utilities function ขึ้นมาใช้เพื่อนำกลับไปใช้ใหม่ได้ในภายหลัง

function writeFile(){
}
function readFile(){
}

ใน
function writeFile(){
}
สมมุติว่าเรามีการนำข้อมูลจากตัวแปร global $_POST มาใช้งานใน function

ก็จะเกิดข้อปัญหาตามมาอย่างมากมายครับ ตัวอย่างเช่น

1. เราไม่สามารถใช้ตัวแปร $_GET มาใช้งานใน function ได้ทั้งๆ ที่รูปแบบข้อมูลของ $_GET เหมือนกับ $_POST
หากเราต้องการทำงานแบบเดียวกับ writeFile กับตัวแปร $_GET ก็ต้องเขียน function ที่เหมือนกับ writeFile เปี๊ยบซ้ำขึ้นมาอีกที
ซึ่ง function ที่มีหน้าที่ซ้ำกัน เวลาแก้โปรแกรมก็ต้องแก้สองที่เพราะถ้า function ไม่สอดคล้องกันยิ่งทำให้โปรแกรมหา error ยากขึ้น
เราไม่ควรเขียน function ที่มีหน้าที่ซ้ำๆ กัน แต่ควรให้ function นั้นรับ parameter $_GET และ $_POST เป็น input แทน

2. หากเกิดมีการเปลี่ยนแปลงตัวแปร $_POST ระหว่างโปรแกรมก่อนที่ writeFile จะนำ $_POST มาใช้ ก็จะทำให้โปรแกรมเกิด error ขึ้น
ตัวอย่างเช่น ใน writeFile ก็ทำงานได้ปกติเสมอมา มีอยู่วันหนึ่งเราแก้ไข writeFile โดยการเรียกใช้ readFile ใน writeFile
โดยไม่รู้ว่า readFile นั้นจะมีการแก้ไขตัวแปร $_POST ด้วย ซึ่งทำให้เกิด error ขึ้นใน writeFile
สมมุติว่าเราทราบแล้วว่าตัวการก็คือ readFile แล้วจะทำอย่างไร เนื่องจากเราต้องการใช้ readFile
มีทางเลือกอยู่สองสามทางซึ่งไม่ได้ช่วยให้ชีวิตง่ายขึ้นเลย เช่นสร้าง function readFile2 ขึ้นใหม่โดยให้มีคำสั่งเหมือนเดิมทั้งหมดยกเว้นไม่ให้ทำการแก้ไข $_POST
ซึ่งก็คล้ายๆ กับ function ซ้ำในข้อ 1. แต่มันน่ารำคาญมากกว่าเพราะจำเป็นต้องเขียน function ซึ่งเวลาแก้ ต้องคอยระวังให้ function ทั้ง 2 สอดคล้องกัน และคอยดูแลส่วนที่ต่างกันด้วย
ดูแล้วยิ่งซับซ้อนเข้าไปใหญ่ กับอีกทางหนึ่งคือ แก้ไข function readFile โดยตรง ซึ่งจะต้องเสี่ยงกับปัญหาที่จะเกิด error ในโปรแกรมอื่นๆ ที่เคยเรียก readFile อยู่ก่อนหน้านี้
ที่เคยเรียกใช้ readFile แบบมีการแก้ไข $_POST มาตลอด

สังเกตว่านี่เป็นแค่เพียงมีการเรียก function ที่มีการแก้ไขตัวแปร global เพียง 1 function ยังทำให้เกิดปัญหาขนาดนี้
ถ้าหาก writeFile มีการเรียก user defined function ที่มีการแก้ไขตัวแปร $_POST สัก 5 function และ function ที่ไม่มีการแก้ไขตัวแปร $_POST อีก 5 function
มีคำถามคือ เวลาตรวจหาว่า function ไหนกันแน่ที่เป็นผู้ส่งผลกระทบกับ $_POST จะต้องค้นหาใน function กี่ function
คำตอบคือ 10 function! เพราะว่าในชื่อ function ไม่ได้ระบุว่า function ไหนเป็นผู้แก้ $_POST และ function ไหนไม่มีผลกระทบกับ $_POST

3. ถ้ามีการใช้ตัวแปร global โดยไม่วางระเบียบเอาไว้อย่างชัดเจน จะทำให้โปรแกรมหา error ได้ยาก
function foo($x){ //สมมุติเราเขียน
global $a;
$a[] = $x;
}
function bar($y){ //สมมุติเพื่อนเขียน
global $a;
$a+=$y;
}
foo(1);
foo(2);
$a = new Db();
foo(3);
bar(2);
bar(3);
bar(4);
ต่างคนใช้ตัวแปร global $a ไปทำหน้าที่เฉพาะที่ต้องการ ซึ่งเวลาใช้แยกกันก็ทำงานตามปกติ
แต่เวลาใช่รวมกันแล้วไม่มีทางใช้ร่วมกันได้เลย ถ้าจะใช่ร่วมกันก็ต้องไปแก้ที่ function ใด function หนึ่ง
ถ้ามีตัวแปร global เยอะๆ การนำกลับมาใช้ใหม่จะทำได้ยาก
เพราะนอกจากการพยายามเลี่ยงไม่ให้ function ชื่อซ้ำกันแล้ว และเลี่ยงชื่อตัวแปรในโปรแกรมไม่ให้ซ้ำกัน
ต้องไปไล่ค้นหาตัวแปร global ใน function เพื่อที่จะหลีกเลี่ยงชื่อตัวแปร global ที่อยู่ใน function นั้นอีก

ที่ยกตัวอย่างมาคือข้อเสียของการใช้ตัวแปร global ใน function ครับ ซึ่งจริงๆ มันมีมากกว่านี้อีกหลายอย่าง
แต่ไม่ใช่ว่ามันจะไม่มีข้อดีเลย แต่จะต้องวางแผนการใช้ตัวแปรให้ดี
และควรระบุจะ comment โปรแกรมว่ามีการเปลี่ยนแปลงตัวแปร global ที่ไหนบ้าง และตัวแปร global นี้ใช้งานอย่างไร

ข้อดีของการใช้ตัวแปร global
- การใช้ตัวแปร global ลดการส่ง parameter ซ้ำซ้อนในโปรแกรม
ถ้าใน 100 function มีการใช้งานตัวแปร $x ทุกครั้ง การให้ $x เป็น parameter จะทำให้ความยาวของโค้ดยาวขึ้นและอ่านยากขึ้น
เราก็อาจจะให้ $x นี้เป็น ตัวแปร global หรือไม่ก็ constant ก็ได้เพื่อให้เราสามารถเรียกใช้ function ของเราทำได้ง่ายขึ้น
การใช้ global ในโปรแกรมควรจะมีแค่ 1-2 ตัว ถ้ามีจำนวนหลายตัว ไม่ควรให้รูปแบบของชื่อเหมือนกับตัวแปร local
เช่นเราอาจตั้งชื่อให้เป็น $gSum, $gTotal, $g_array, $_gdata ฯลฯ เพื่อให้แยกแยะตัวแปรได้ง่ายขึ้น
- เร็วกว่าการส่ง parameter
การส่ง parameter โดยปกติจะมีการคัดลอกค่าไปไว้ในหน่วยความจำชั่วคราว ซึ่งจะเสียเวลาในการประมวลผลในส่วนนี้
แต่ถ้าถ้าเป็นตัวแปร global จะเป็นข้อมูลเพียงตัวเดียวไม่ต้อง copy ค่าไปไว้ที่ใหม่จึงทำงานเร็วกว่าและประหยัดพื้นที่มากกว่า
- ในโครงสร้างภาษาแบบ OOP ต่างๆ เห็นประโยชน์ของตัวแปร global จึงสร้างรูปแบบตัวแปร global ที่มีขอบเขตแคบลง
โดยเป็น global เฉพาะภายใน object นั้นๆ ที่เรียกว่า attribute หรือ property ของ object นั่นเอง
ทำให้ใน function หรือ method ต่างๆ มีการใช้ตัวแปรของ object ร่วมกันได้ไม่จำเป็นต้องส่ง parameter ไปมา
การลดขอบเขตของตัวแปร global กลายเป็นเป็นสมาชิก attribute ของ object ทำให้เราขอบเขตของ function ที่ส่งผลกับตัวแปร
แคบลงไปเป็นเพียงแค่ function ที่อยู่ในกลุ่มของ class เดียวกันเท่านั้น ที่อาจจะส่งผลกระทบกับตัวแปร

==============================

ตัวอย่าง function ที่ดี
1. input เข้าทางเดียวและ output ออกทางเดียว
- input เข้าทาง parameter
- output ออกทาง จุดคืนค่าของ function
function goodFunction($a,$b){
return $a+$b;
}
$_POST['z'] = goodFunction($_POST['x'],$_POST['y']);
การเปลี่ยนแปลงตัวแปร $_POST['z'] จะไม่ทำใน function
แต่จะแสดงออกโดยชัดเจนจาก การที่ $_POST['z'] ได้รับจาก goodFunction
ซึ่งทำให้แก้โปรแกรมได้ง่ายเพราะไม่ต้องกังวลว่าการแก้ตัวแปรจะส่งผลกับ function
เมื่อมีการแก้ไขตัวแปรก็จะทราบว่าตัวแปรไหนได้รับผลกระทบจาก function ไหนได้ทันที


ตัวอย่าง function ที่ไม่ดี
1. input เข้าหลายทาง
function badFunction($a,$b){
global $n;
return $n+$a+$b;
}
$n = 10; //ไม่แสดงออกว่ามันเป็น input ตามธรรมชาติอย่างการส่ง parameter
$_POST['z'] = badFunction($_POST['x'],$_POST['y']);

2. output ออกหลายทาง
function badFunction2($a,&$b){
$b++;
return $a+$b;
}
$a = 11;
$b = 22;
$c = badFunction2($a,$b); //ไม่แสดงออกว่ามันเป็น output ตามธรรมชาติอย่างการคืนค่าของ function
คนที่ไม่ได้เป็นผู้เขียน function จะไม่รู้เลยว่า ตัวแปร $b ได้รับผลกระทบจาก function

ตัวอย่าง function ที่พอใช้ได้แต่ไม่ค่อยดีเท่าไหร่
1. input และ output ทางเดียว แต่ะเข้าและออกในทางเดียวกัน
function increaseAll(&$a,&$b,&$c){
$a++;
$b++;
$c++;
}
มี input และ output ทางเดียว แต่ output ไม่เป็นธรรมชาติ
ควรจะเขียนและใช้งาน function รูปแบบนี้เท่าที่จำเป็น

ในการเขียนโปรแกรมแบบ OOP มักจะเทคนิคการส่ง parameter เป็น object อยู่
ซึ่งเป็นเทคนิคที่คล้ายๆ กับ function increaseAll นี้คือการส่งแบบ reference
ทำให้ สมาชิก attribute ในตัวแปร object จะถูกเปลี่ยนแปลงใน function ได้ด้วย
ข้อดีของการส่ง object แบบ reference นี้ก็คือลดปริมาณการคัดลอกข้อมูลสมาชิกของ object
อย่างไรก็ตามก็ไม่ควรใช้เทคนิคนี้พร่ำเพรื่อ เพราะเป็นการเขียน function ในรูปแบบที่อ่านเข้าใจยาก
ควรเขียน function แบบนี้ เมื่อวิเคราะห์แล้วว่ารูปแบบนี้ เป็นรูปแบบที่เหมาะสมมากกว่ารูปแบบ function อื่นๆ

========================
อะไรๆ ก็มักจะมีข้อยกเว้นครับ ถ้ามันเหมาะสมกว่าจริงๆ หรือบางทีจำเป็นต้องเขียนโปรแกรมให้เสร็จได้เร็วๆ
ก็ลืมๆ หลักการหยุมหยิมๆ ก็ช่วยให้เขียนโปรแกรมได้ทันเวลามากกว่าครับ :D

หลักการสำคัญของการเขียนโปรแกรม
- KISS : Keep it simple, stupid
การเขียนโปรแกรมที่ซับซ้อนได้ ไม่ใช่สิ่งเดียวที่ระบุได้ว่าเป็นคนที่เขียนโปรแกรมได้เก่ง
ยังมีอีกหลายๆ ด้านที่สามารถระบุและอาจจะสำคัญมากกว่าการเขียนโปรแกรมยากๆ ได้อีกครับ
อย่างเช่น การเขียนโปรแกรมอ่านง่าย การเขียนโปรแกรมที่นำกลับมาใช้ได้ใหม่ การเขียนโปรแกรมแล้วมีความปลอดภัย
การเขียนโปรแกรมได้รวดเร็ว การเขียน user friendly หรือใช้งานได้ง่าย การเขียนโปรแกรมให้ตกแต่ง theme ได้ง่าย
KISS เป็นหลักการหนึ่ง ที่เป็นการย้ำเตือนให้กับโปรแกรมเมอร์ว่า ถ้าคุณเขียนโปรแกรมซับซ้อนเกินไป
คุณจะทำงานเสร็จช้า อ่านได้ยาก แก้ไขได้ยาก โค้ดของคุณอาจจะเข้าถึงระดับเทพ ใครมาเห็นจะต้องตะลึง
แต่พอผ่านไป 3 เดือน คุณจำเป็นต้องกลับมาแก้โค้ดใหม่
ถ้าคุณเขียนซับซ้อนมากเกินไป คุณก็จะต้องตกตะลึงกับโปรแกรมที่ตัวเองเขียนด้วยเหมือนกันครับ แหะๆ

บรรยายยาวมาก ไม่รู้จะอ่านกันจบหรือเปล่า ขอให้อ่านกันด้วยความสนุกนะครับ อิๆ
Date : 2009-08-19 22:03:01 By : num
 


 

No. 7



โพสกระทู้ ( 830 )
บทความ ( 0 )



สถานะออฟไลน์


เท่าที่ผมได้มีประสบการณ์เขียนมาหลายเว็บแล้ว

ผมว่า เราไม่เคยใช้ $_GET หรือ $_POST ในฟังค์ชั่นอะ

ผมจะใช้การส่ง พารามิเตอร์เอา

ผมมีความรุ้สึกว่า การส่ง Paramiter มันยืดยุ่นกว่า การใช้ ตัวแปร $_GET หรือ $_POST ในฟังค์ชั่น
Date : 2009-08-19 22:18:47 By : danya
 


 

No. 8



โพสกระทู้ ( 581 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ขอบคุณ ครับเป็น ความรู้ที่ดีมากๆครับ ...
Date : 2009-08-20 10:01:36 By : nilas
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : สอบถาม ผลเสียของการ ใช้ตัว แบบ global ใน function เยอะ นะครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่