การเขียนโปรแกรม D - ไม่เปลี่ยนรูป

เรามักใช้ตัวแปรที่เปลี่ยนแปลงได้ แต่อาจมีหลายครั้งที่ไม่จำเป็นต้องมีความผันแปร ตัวแปรที่ไม่เปลี่ยนรูปสามารถใช้ได้ในกรณีเช่นนี้ มีตัวอย่างบางส่วนด้านล่างซึ่งสามารถใช้ตัวแปรที่ไม่เปลี่ยนรูปได้

  • ในกรณีของค่าคงที่ทางคณิตศาสตร์เช่นpiที่ไม่เคยเปลี่ยนแปลง

  • ในกรณีของอาร์เรย์ที่เราต้องการคงค่าไว้และไม่ใช่ข้อกำหนดของการกลายพันธุ์

ความไม่เปลี่ยนรูปทำให้เข้าใจได้ว่าตัวแปรไม่เปลี่ยนรูปหรือเปลี่ยนแปลงได้หรือไม่โดยรับประกันว่าการดำเนินการบางอย่างจะไม่เปลี่ยนแปลงตัวแปรบางตัว นอกจากนี้ยังลดความเสี่ยงจากข้อผิดพลาดของโปรแกรมบางประเภท แนวคิดความไม่เปลี่ยนรูปของ D แสดงโดยคำหลัก const และไม่เปลี่ยนรูป แม้ว่าทั้งสองคำจะมีความหมายใกล้เคียงกัน แต่ความรับผิดชอบในโปรแกรมจะแตกต่างกันและบางครั้งก็เข้ากันไม่ได้

แนวคิดความไม่เปลี่ยนรูปของ D แสดงโดยคำหลัก const และไม่เปลี่ยนรูป แม้ว่าทั้งสองคำจะมีความหมายใกล้เคียงกัน แต่ความรับผิดชอบในโปรแกรมจะแตกต่างกันและบางครั้งก็เข้ากันไม่ได้

ประเภทของตัวแปรที่ไม่เปลี่ยนรูปใน D

ตัวแปรกำหนดมีสามประเภทที่ไม่มีวันกลายพันธุ์

  • ค่าคงที่ของ enum
  • ตัวแปรที่ไม่เปลี่ยนรูป
  • ตัวแปร const

enumคงที่ใน D

ค่าคงที่ของ enum ทำให้สามารถเชื่อมโยงค่าคงที่กับชื่อที่มีความหมายได้ ตัวอย่างง่ายๆแสดงไว้ด้านล่าง

ตัวอย่าง

import std.stdio;

enum Day{ 
   Sunday = 1, 
   Monday,
   Tuesday, 
   Wednesday, 
   Thursday, 
   Friday, 
   Saturday 
} 
 
void main() { 
   Day day; 
   day = Day.Sunday;
   
   if (day == Day.Sunday) { 
      writeln("The day is Sunday"); 
   } 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

The day is Sunday

ตัวแปรที่ไม่เปลี่ยนรูปใน D

ตัวแปรที่ไม่เปลี่ยนรูปสามารถกำหนดได้ในระหว่างการทำงานของโปรแกรม เพียงแค่สั่งคอมไพเลอร์ว่าหลังจากการเริ่มต้นแล้วมันจะไม่เปลี่ยนรูป ตัวอย่างง่ายๆแสดงไว้ด้านล่าง

ตัวอย่าง

import std.stdio; 
import std.random; 
 
void main() { 
   int min = 1; 
   int max = 10; 
   
   immutable number = uniform(min, max + 1); 
   // cannot modify immutable expression number 
   // number = 34; 
   typeof(number) value = 100;  
   
   writeln(typeof(number).stringof, number); 
   writeln(typeof(value).stringof, value); 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

immutable(int)4 
immutable(int)100

คุณสามารถดูในตัวอย่างด้านบนว่าเป็นไปได้อย่างไรในการถ่ายโอนประเภทข้อมูลไปยังตัวแปรอื่นและใช้สตริงของขณะพิมพ์

ตัวแปรConstใน D

ไม่สามารถแก้ไขตัวแปร Const ที่คล้ายกับไม่เปลี่ยนรูปได้ ตัวแปรที่ไม่เปลี่ยนรูปสามารถส่งผ่านไปยังฟังก์ชันเป็นพารามิเตอร์ที่ไม่เปลี่ยนรูปได้ดังนั้นจึงขอแนะนำให้ใช้ไม่เปลี่ยนรูปบน const ตัวอย่างเดียวกันกับที่ใช้ก่อนหน้านี้ถูกแก้ไขสำหรับ const ดังที่แสดงด้านล่าง

ตัวอย่าง

import std.stdio; 
import std.random; 
 
void main() { 
   int min = 1; 
   int max = 10; 
   
   const number = uniform(min, max + 1); 
   // cannot modify const expression number| 
   // number = 34; 
   typeof(number) value = 100; 
   
   writeln(typeof(number).stringof, number); 
   writeln(typeof(value).stringof, value); 
}

หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

const(int)7 
const(int)100

พารามิเตอร์ที่ไม่เปลี่ยนรูปใน D

const จะลบข้อมูลเกี่ยวกับว่าตัวแปรดั้งเดิมนั้นเปลี่ยนแปลงได้หรือไม่เปลี่ยนรูปและด้วยเหตุนี้การใช้ไม่เปลี่ยนรูปจึงทำให้มันส่งผ่านฟังก์ชันอื่น ๆ โดยที่ประเภทดั้งเดิมยังคงอยู่ ตัวอย่างง่ายๆแสดงไว้ด้านล่าง

ตัวอย่าง

import std.stdio; 
 
void print(immutable int[] array) { 
   foreach (i, element; array) { 
      writefln("%s: %s", i, element); 
   } 
}
  
void main() { 
   immutable int[] array = [ 1, 2 ]; 
   print(array); 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

0: 1 
1: 2