สวัสดี! ในบทความนี้เราจะพูดถึงตัวแปรทั่วโลก การประกาศ และตัวอย่างการใช้งานที่เหมาะสม หมายเหตุเล็กๆ น้อยๆ: เราจะไม่พิจารณาตัวแปรคลาสสากล ซึ่งก็คือตัวแปรที่สามารถเข้าถึงได้ภายในคลาสใดคลาสหนึ่ง เราจะพูดถึงตัวแปรส่วนกลางของแอปพลิเคชันทั้งหมด - ตัวแปรที่สามารถเข้าถึงได้ภายในแอปพลิเคชันทั้งหมด
อย่างไรก็ตาม เราสามารถอ่านค่าของมันได้:
เริ่มจากข้อเสียกันก่อน ลองจินตนาการถึงแอปพลิเคชันที่มีคลาสที่มีตัวแปรโกลบอลที่สามารถอ่านและแก้ไขได้ เมื่อเวลาผ่านไป จำนวนคลาสในโปรเจ็กต์ จำนวนตัวแปรโกลบอล และวิธีการที่ใช้ตัวแปรโกลบอล หรืออีกนัยหนึ่ง ขึ้นอยู่กับคลาสเหล่านั้น จะเพิ่มขึ้น เมื่อเวลาผ่านไป ตัวแปรส่วนกลางแต่ละตัวจะถูกอ่านในส่วนต่างๆ ของระบบเพื่อวัตถุประสงค์ที่แตกต่างกัน ค่าของตัวแปรสามารถอัพเดตได้ในส่วนต่างๆ ของระบบ ภาพรวมของโลกของแอปพลิเคชั่นนี้มีความซับซ้อนมากขึ้นอย่างเห็นได้ชัด และนำไปสู่ข้อเสียดังต่อไป นี้ :
วิธีสร้างตัวแปรโกลบอล
ตัวแปรร่วมคือตัวแปรที่สามารถเข้าถึงได้จากทุกที่ในแอปพลิเคชัน กล่าวอีกนัยหนึ่ง ขอบเขตคือแอปพลิเคชันทั้งหมด หากต้องการสร้างตัวแปรดังกล่าวใน Java คุณต้องสร้างตัวแปรสแตติกสาธารณะในคลาสสาธารณะ:public class Example {
public static int a;
public static int b;
public static String str;
}
ตัวแปรa
และb
- str
ได้กลายเป็นแบบโกลบอล เราสามารถเข้าถึงได้โดยตรงจากคลาสอื่นภายในแอปพลิเคชัน:
public class GlobalVarsDemo {
public static void main(String[] args) {
Example.a = 4;
Example.b = 5;
Example.str = "Global String variable value";
System.out.println(Example.a);
System.out.println(Example.b);
System.out.println(Example.str);
}
}
ถ้าเรารัน method main
เราจะเห็นผลลัพธ์ดังนี้:
4
5
Global String variable value
ตัวแปรทั่วโลกแบ่งได้เป็น 2 ประเภท คือ
- ตัวแปรที่สามารถแก้ไขได้
- ตัวแปรที่สามารถอ่านได้เท่านั้น
final
และกำหนดค่าให้กับตัวแปรเมื่อกำหนดตัวแปร:
public class Constants {
public static final double PI = 3.1415926535897932384626433832795;
public static final String HELLO_WORLD_STR = "Hello, World!";
}
ตามหลักการตั้งชื่อ Java ค่าคงที่ทั้งหมดจะต้องตั้งชื่อเป็นตัวพิมพ์ใหญ่ โดยแยกคำด้วยอักขระขีดล่าง ดังนั้นเราจึงสร้างค่าคงที่ และตอนนี้เราไม่สามารถเปลี่ยนค่าของมันได้
public class HelloWorld {
public static void main(String[] args) {
System.out.println(Constants.HELLO_WORLD_STR);
}
}
บทสรุป:
Hello, World!
public class ConstantsDemo {
public static void main(String[] args) {
double r = 10;
String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
System.out.println(message);
}
static double getCircleSquare(double r) {
return Constants.PI * r * r;
}
}
บทสรุป:
Площадь круга с радиусом 10,000000=314,159265
คุณควรใช้ตัวแปรส่วนกลางหรือไม่
มีบทความมากมายบนอินเทอร์เน็ต ข้อความหลักคือ: ตัวแปรทั่วโลกนั้นชั่วร้าย แย่ และแย่มาก จริงเหรอ? เรามาลองให้ข้อดีข้อเสียของตัวแปรทั่วโลกเพื่อให้ทุกคนสามารถสรุปผลของตนเองได้
- ลดความสามารถในการอ่านและเพิ่มความยากลำบากในการทำความเข้าใจโค้ด
- เพิ่มความซับซ้อนในการบำรุงรักษาโค้ด
- หากต้องการเปลี่ยนตัวแปรร่วมตัวหนึ่ง จำเป็นต้องวิเคราะห์โค้ดทั้งหมดเพื่อไม่ให้ตั้งค่าตัวแปรเป็นค่าที่ไม่ถูกต้องสำหรับส่วนอื่นๆ ของระบบ
- เพิ่มข้อผิดพลาดที่ยากต่อการแก้ไข
ลองจินตนาการถึงตัวแปรโกลบอล ซึ่งเป็นอาร์เรย์ของอ็อบเจ็กต์ ตัวอย่างเช่น ในส่วนหนึ่งของระบบ คาดว่าสตริงในอาร์เรย์นี้ และในอีกส่วนหนึ่งของระบบ มีคนตัดสินใจใช้ตัวเลขทศนิยม ไม่น่าเป็นไปได้ที่ใครจะอยากเข้าใจสิ่งนี้
- ชื่อตัวแปรอาจเหมือนกันหากคุณใช้ตัวแปรร่วมในโค้ดของคุณ เช่นเดียวกับไลบรารีบางแห่งที่ใช้ตัวแปรร่วมด้วยเช่นกัน สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดทั้งด้านข้างของแอปพลิเคชันของคุณและด้านข้างของไลบรารีที่คุณใช้อยู่
- เพิ่มการเชื่อมต่อระหว่างส่วนต่างๆ ของระบบที่ใช้ตัวแปรส่วนกลาง ในทางตรงกันข้าม คุณควรพยายามให้โค้ดมีความเชื่อมโยงกันอย่างหลวมๆ จะดีกว่าถ้ามีระบบย่อยเล็กๆ หลายระบบเชื่อมต่อกันแบบหลวมๆ แทนที่จะมีระบบย่อยหนักๆ เพียงระบบเดียว เพราะสมองจะจัดการกับเรื่องง่ายๆ หลายอย่างได้ง่ายกว่าเรื่องที่ซับซ้อนและสับสนเกินไป
- การเขียนการทดสอบหน่วยจะยากขึ้นเนื่องจากการทดสอบไม่ทราบว่าจำเป็นต้องใช้ตัวแปรส่วนกลางตัวใด และจำเป็นต้องเริ่มต้นอย่างไร
- ในแอปพลิเคชันแบบมัลติเธรด การใช้ตัวแปรโกลบอลตามเธรดที่แตกต่างกันนำไปสู่ข้อผิดพลาดที่เพิ่มขึ้นซึ่งยากต่อการดีบั๊ก และเพิ่มความซับซ้อนของโปรเจ็กต์ ด้วยเหตุนี้จึงจำเป็นต้องกำหนดค่าการเข้าถึงตัวแปรดังกล่าวให้ถูกต้องมากขึ้นโดยจัดให้มีการซิงโครไนซ์และการล็อค ซึ่งอาจนำไปสู่การลัดวงจรได้ในอนาคต ตัวอย่างเช่น เธรด A ได้ล็อกตัวแปร X สำหรับงานของตน และเธรด B ได้ล็อกตัวแปร Y สำหรับงานของตน และขณะนี้เธรด A ต้องการตัวแปร Y และเธรด B ต้องการตัวแปร X ผลก็คือ โปรแกรมจะหยุดทำงาน
- ในโปรเจ็กต์ขนาดเล็ก ตัวแปรโกลบอลคือสิ่งที่ง่ายที่สุดในการทำให้โปรเจ็กต์ทำงานได้
- บางครั้งความกลัวในการใช้ตัวแปรส่วนกลางก็นำไปสู่ความซับซ้อนมากขึ้นในโปรเจ็กต์ จากนั้นโปรแกรมเมอร์ก็เริ่มสร้างซิงเกิลตันและหันมาใช้รูปแบบการออกแบบอื่นๆ
- ในการเขียนโปรแกรม คุณมักจะต้องอาศัยค่าที่ไม่เปลี่ยนรูปบางอย่าง
สิ่งที่สมเหตุสมผลที่สุดคือการเขียนค่าเช่นค่าคงที่เนื่องจากค่าคงที่เท่านั้นที่รับประกันได้ว่าค่าของตัวแปรจะไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป ค่าคงที่ดังกล่าวสามารถพบได้ตลอดเวลา (
Integer.MAX_VALUE
,Integer.MIN_VALUE
,Boolean.TRUE
,Collections.EMPTY_LIST
ฯลฯ) แต่การเขียนโปรแกรมไม่ได้จำกัดอยู่เพียงการใช้ไลบรารีมาตรฐานเท่านั้น บ่อยครั้งที่คุณต้องเขียนตรรกะเฉพาะบางอย่าง ซึ่งจะต้องอาศัยค่าคงที่เฉพาะของคุณเอง นั่นเป็นสาเหตุที่บางครั้งการใช้ค่าคงที่ (ตัวแปรส่วนกลางแบบอ่านอย่างเดียว) ทำให้ชีวิตง่ายขึ้นจริงๆ
- ทุกสิ่งที่นักพัฒนามือใหม่เขียนถือเป็นโครงการขนาดเล็ก และการใช้ตัวแปรส่วนกลางในโครงการของเขาจะสอนให้เขาใช้ตัวแปรส่วนกลางทุกที่
- เป็นการดีกว่าที่จะเรียนรู้ที่จะทำโดยไม่มี "เทคนิคต้องห้าม" ก่อน และด้วยประสบการณ์ ความเข้าใจว่าเมื่อใดเทคนิคดังกล่าวจึงเหมาะสมที่จะใช้จะเกิดขึ้นเอง
GO TO FULL VERSION