ฉันคิดว่าคำว่า "สถานะ" (ตรงข้ามกับสถานะที่เป็นรูปธรรมเช่น "ตัวแปรสมาชิก") มีประโยชน์มากที่สุดเมื่อเปรียบเทียบ API แบบรัฐกับสถานะไร้รัฐ การพยายามกำหนด "สถานะ" โดยไม่ต้องเอ่ยถึง API ก็เหมือนกับการพยายามกำหนด "ตัวแปร" หรือ "ฟังก์ชั่น" โดยไม่พูดถึงภาษาโปรแกรม คำตอบที่ถูกต้องส่วนใหญ่เหมาะสมกับคนที่รู้อยู่แล้วว่าคำนั้นหมายถึงอะไร
Stateful vs Stateless
- stateful API เป็นสิ่งหนึ่งที่จะ "จำ" สิ่งที่ฟังก์ชั่นที่คุณได้เรียกว่าเพื่อให้ห่างไกลและกับสิ่งที่ขัดแย้งดังนั้นครั้งต่อไปที่คุณเรียกฟังก์ชั่นก็จะใช้ข้อมูลนั้น ส่วน "ความทรงจำ" มักถูกนำไปใช้กับตัวแปรสมาชิก แต่นั่นไม่ใช่วิธีเดียว
- ไร้สัญชาติ API เป็นหนึ่งที่ทุกฟังก์ชั่นการโทรขึ้นอยู่เพียงผู้เดียวในการขัดแย้งผ่านไปและไม่มีอะไรอื่น
ตัวอย่างเช่น OpenGL นั้นน่าจะเป็น API ที่มีชื่อเสียงที่สุดที่ฉันรู้จัก หากฉันอาจพูดเกินจริงอย่างน่าหัวเราะสักครู่เราอาจพูดว่ามันเป็นดังนี้:
glSetCurrentVertexBufferArray(vba1);
glSetCurrentVertexBufferObject(vbo1);
glSetCurrentVertexShader(vert1);
glSetCurrentFragmentShader(frag1);
// a dozen other things
glActuallyDrawStuffWithCurrentState(GL_TRIANGLES);
เกือบทุกฟังก์ชั่นจะใช้เพื่อส่งผ่านในบางสถานะของ OpenGL ที่ต้องจำไว้แล้วในตอนท้ายคุณเรียกฟังก์ชันที่เรียบง่ายแบบ anticlimactically ทำรูปวาดทั้งหมด
OpenGL รุ่นที่ไร้สัญชาติ (มีขนาดใหญ่เกินไป) อาจมีลักษณะเช่นนี้:
glActuallyDrawStuff(vba1, vbo1, vert1, frag1, /* a dozen other things */, GL_TRIANGLES);
คุณมักจะได้ยินคนพูดว่า API ที่มีสถานะน้อยจะให้เหตุผลได้ง่ายกว่า หากคุณสามารถนับการโต้แย้งได้ภายใต้การควบคุมโดยทั่วไปฉันเห็นด้วย
ไม่แน่นอน vs ไม่เปลี่ยนรูป
เท่าที่ผมทราบความแตกต่างนี้มีความหมายเฉพาะเมื่อคุณสามารถระบุสถานะเริ่มต้น ตัวอย่างเช่นการใช้ตัวสร้าง C ++:
// immutable state
ImmutableWindow windowA = new ImmutableWindow(600, 400);
windowA = new ImmutableWindow(800, 600); // to change the size, I need a whole new window
// mutable state
MutableWindow windowB = new MutableWindow(600, 400);
windowB.width = 800; // to change the size, I just alter the existing object
windowB.height = 600;
จะเป็นการยากที่จะใช้คลาสหน้าต่างที่ไม่ "จำ" ขนาดเท่านี้ แต่คุณสามารถตัดสินใจได้ว่าผู้ใช้ควรจะสามารถเปลี่ยนขนาดของหน้าต่างหลังจากสร้างได้หรือไม่
PSใน OOP มันเป็นความจริงที่ "state" มักจะหมายถึง "ตัวแปรสมาชิก" แต่มันอาจจะมากกว่านั้น ตัวอย่างเช่นใน C ++ เมธอดสามารถมีตัวแปรแบบสแตติกและ lambdas สามารถปิดได้โดยการจับตัวแปร ในทั้งสองกรณีตัวแปรเหล่านั้นยังคงมีอยู่ในการเรียกใช้ฟังก์ชันหลายครั้งและอาจมีคุณสมบัติเป็นสถานะ ตัวแปรท้องถิ่นในฟังก์ชั่นปกติอาจได้รับการพิจารณาสถานะขึ้นอยู่กับวิธีที่พวกเขาใช้ (คนที่ฉันมีใน main () มักนับ)