ไร้สัญชาติ VS ไร้สัญชาติ


95

ฉันสนใจบทความที่มีข้อมูลที่เป็นรูปธรรมเกี่ยวกับการออกแบบที่ไร้สัญชาติและไร้สัญชาติในการเขียนโปรแกรม ฉันสนใจเพราะต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ แต่ไม่พบบทความดีๆเกี่ยวกับเรื่องนี้เลย ฉันได้อ่านบทความหลายสิบบทความบนเว็บที่พูดคุยเกี่ยวกับเรื่องนี้อย่างคลุมเครือหรือพวกเขากำลังพูดถึงเว็บเซิร์ฟเวอร์และเซสชัน - ซึ่งเป็น 'การแข่งขันแบบ stateful vs stateless แต่ฉันสนใจในการออกแบบแอตทริบิวต์แบบไร้สัญชาติและแบบ stateful ในการเขียนโค้ด . ตัวอย่าง: ฉันเคยได้ยินมาว่าคลาส BL ไร้สัญชาติโดยการออกแบบคลาสเอนทิตี (หรืออย่างน้อยนั่นคือสิ่งที่ฉันเรียกพวกเขาเช่น Person (id, name, .. )) เป็นสถานะ ฯลฯ

ฉันคิดว่าสิ่งสำคัญที่ต้องรู้เพราะฉันเชื่อว่าถ้าฉันเข้าใจมันฉันจะเขียนโค้ดได้ดีขึ้น (เช่นความละเอียดในใจ)

อย่างไรก็ตามสั้น ๆ จริงๆนี่คือสิ่งที่ฉันรู้ว่า 'การแข่งขันแบบ stateful vs stateless:

Stateful (เช่น WinForms): จัดเก็บข้อมูลเพื่อใช้งานต่อไป แต่จำกัดความสามารถในการปรับขนาดของแอปพลิเคชันเนื่องจากถูก จำกัด โดยขีด จำกัด ของ CPU หรือหน่วยความจำ

ไม่มีสถานะ (เช่นเดียวกับ ASP.NET - แม้ว่า ASP จะพยายามทำให้เป็นสถานะด้วย ViewStates): หลังจากดำเนินการเสร็จสิ้นข้อมูลจะถูกถ่ายโอนและอินสแตนซ์จะถูกส่งกลับไปยังเธรดพูล (Amorphous)

อย่างที่คุณเห็นข้อมูลค่อนข้างคลุมเครือและมี จำกัด (และค่อนข้างเน้นการโต้ตอบกับเซิร์ฟเวอร์) ดังนั้นฉันจะขอบคุณมากถ้าคุณสามารถให้ข้อมูลที่อร่อยกว่านี้แก่ฉัน :)

คำตอบ:


58

ฉันขอแนะนำให้คุณเริ่มจากคำถามใน StackOverflow ที่กล่าวถึงข้อดีของการเขียนโปรแกรมแบบไม่ระบุสถานะ นี่เป็นมากกว่าในบริบทของการเขียนโปรแกรมเชิงฟังก์ชัน แต่สิ่งที่คุณจะอ่านยังนำไปใช้ในกระบวนทัศน์การเขียนโปรแกรมอื่น ๆ

การเขียนโปรแกรมแบบไม่ระบุสถานะเกี่ยวข้องกับแนวคิดทางคณิตศาสตร์ของฟังก์ชันซึ่งเมื่อเรียกด้วยอาร์กิวเมนต์เดียวกันจะให้ผลลัพธ์เดียวกันเสมอ นี่เป็นแนวคิดหลักของกระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชันและฉันคาดหวังว่าคุณจะสามารถพบบทความที่เกี่ยวข้องมากมายในพื้นที่นั้น

อีกด้านหนึ่งที่คุณสามารถค้นคว้าเพื่อทำความเข้าใจเพิ่มเติมคือบริการเว็บ RESTful สิ่งเหล่านี้เกิดจากการออกแบบ "ไร้สัญชาติ" ตรงกันข้ามกับเทคโนโลยีเว็บอื่น ๆ ที่พยายามรักษาสถานะไว้ (ในความเป็นจริงสิ่งที่คุณพูดว่า ASP.NET ไร้สัญชาตินั้นไม่ถูกต้อง - ASP.NET พยายามอย่างหนักที่จะรักษาสถานะโดยใช้ ViewState และแน่นอนว่าจะมีลักษณะเป็น stateful ในทางกลับกัน ASP.NET MVC เป็นเทคโนโลยีไร้สัญชาติ) มีหลายสถานที่ที่กล่าวถึง "ไร้สัญชาติ" ในการให้บริการเว็บสงบ (เหมือนนี้จุดบล็อก) แต่คุณสามารถเริ่มต้นอีกครั้งจาก SO คำถาม


เอาล่ะขอบคุณสำหรับข้อมูลฉันได้ดูลิงก์และพบข้อมูลที่น่าสนใจ! แม้ว่าฉันจะยังคงเปิดให้เพิ่มเติมอยู่ก็ตาม;)
Team-JoKi

ฉันได้เพิ่มพื้นที่อื่นที่มีสถานะและไร้สัญชาติเป็นปัจจัยสำคัญ (บริการบนเว็บที่เหลือ)
kgiannakakis

ขอบคุณสำหรับข้อมูล! ฉันจะโหวตคำตอบของคุณ แต่ฉันยังมีตัวแทนไม่เพียงพอ> _>
Team-JoKi

แอปพลิเคชันเว็บจำนวนมากมีสถานะสมบูรณ์เนื่องจากหน้าลงชื่อสมัครใช้เดียวกันให้ผลลัพธ์ที่แตกต่างกันสำหรับเครดิตผู้ใช้ ... การลงชื่อสมัครใช้ครั้งแรกจะประสบความสำเร็จ ... ครั้งที่สองด้วยการลงชื่อสมัครใช้ข้อมูลเดียวกันจะล้มเหลว .... เนื่องจาก webapp มีสถานะของผู้ใช้ที่เก็บไว้ที่ใดที่หนึ่ง .. อาจเป็นฐานข้อมูลหรือพื้นที่จัดเก็บที่แตกต่างกัน
รู้สึกดีและเขียนโปรแกรม

86

การไร้สัญชาติหมายความว่าไม่มีความทรงจำเกี่ยวกับอดีต ทุกธุรกรรมจะดำเนินการราวกับว่าเป็นการทำครั้งแรก

Statefulหมายถึงมีความทรงจำในอดีต ธุรกรรมก่อนหน้าจะถูกจดจำและอาจส่งผลต่อธุรกรรมปัจจุบัน

ไร้สัญชาติ:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

สถานะ:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

อ้างอิงจาก: /software/101337/whats-the-difference-between-stateful-and-stateless


73

แอปที่มีสถานะเป็นแอปที่เก็บข้อมูลเกี่ยวกับสิ่งที่เกิดขึ้นหรือเปลี่ยนแปลงตั้งแต่เริ่มทำงาน ข้อมูลสาธารณะใด ๆ เกี่ยวกับ "โหมด" ที่อยู่ในหรือจำนวนบันทึกที่ประมวลผลหรืออะไรก็ตามที่ทำให้เป็นสถานะ

แอปไร้สัญชาติจะไม่เปิดเผยข้อมูลใด ๆ พวกเขาให้การตอบสนองเดียวกันกับการเรียกใช้ฟังก์ชันหรือเมธอดเดียวกันทุกครั้ง HTTP ไม่มีสถานะในรูปแบบดิบ - หากคุณทำ GET ไปยัง URL ใด URL หนึ่งคุณจะได้รับการตอบสนองแบบเดียวกันทุกครั้ง (ตามหลักวิชา) ข้อยกเว้นคือเมื่อเราเริ่มเพิ่มสถานะด้านบนเช่นกับเว็บแอป ASP.NET :) แต่ถ้าคุณนึกถึงเว็บไซต์คงที่ที่มีไฟล์ HTML และรูปภาพเท่านั้นคุณจะรู้ว่าฉันหมายถึงอะไร


18

คำคุณศัพท์ Stateful หรือ Stateless หมายถึงสถานะของการสนทนาเท่านั้นไม่เกี่ยวข้องกับแนวคิดของฟังก์ชันที่ให้เอาต์พุตเดียวกันสำหรับอินพุตเดียวกัน หากเป็นเช่นนั้นเว็บแอปพลิเคชันแบบไดนามิกใด ๆ (ที่มีฐานข้อมูลอยู่เบื้องหลัง) จะเป็นบริการที่มีสถานะซึ่งเป็นเท็จอย่างเห็นได้ชัด ด้วยเหตุนี้หากฉันมอบความไว้วางใจให้งานรักษาสถานะการสนทนาไว้ในเทคโนโลยีพื้นฐาน (เช่นเซสชัน coockie หรือ http) ฉันกำลังใช้งานบริการแบบ stateful แต่ถ้าข้อมูลที่จำเป็นทั้งหมด (บริบท) ถูกส่งไปเป็นพารามิเตอร์ I ' การใช้บริการไร้สัญชาติ ควรสังเกตว่าแม้ว่าพารามิเตอร์ที่ส่งผ่านจะเป็น "ตัวระบุ" ของสถานะการสนทนา (เช่น ticket หรือ sessionId) เรายังคงดำเนินการภายใต้บริการไร้สัญชาติ


ไม่แน่ใจว่าการส่งsession identifierคำขอทุกครั้งถือเป็นคนไร้สัญชาติหรือไม่ ในมุมมองของฉันกรณีดังกล่าวจะถือว่ามีสถานะ อย่างไรก็ตามหากคุณส่งต่อtokenให้กับผู้ใช้เสมอ แต่ไม่มีสถานะอื่นใดนอกจากเป็นคนไร้สัญชาติ แต่รู้สึกถึงสถานะ XD นี่จึงสับสน
7hi4g0

4

เงินที่โอนทางออนไลน์จากบัญชีหนึ่งไปยังอีกบัญชีหนึ่งมีสถานะเป็นบัญชีเนื่องจากบัญชีรับเงินมีข้อมูลเกี่ยวกับผู้ส่ง การส่งมอบเงินสดจากบุคคลหนึ่งไปยังบุคคลอื่นธุรกรรมนี้ไม่มีกฎเกณฑ์เนื่องจากหลังจากได้รับเงินสดแล้วจะไม่มีเงินสดอยู่ที่นั่น


1

เพียงเพื่อเพิ่มการมีส่วนร่วมของผู้อื่น .... อีกวิธีหนึ่งคือดูจากเว็บเซิร์ฟเวอร์และมุมมองของการทำงานพร้อมกัน ...

HTTP ไม่มีสถานะในลักษณะด้วยเหตุผล ... ในกรณีของเว็บเซิร์ฟเวอร์การมีสถานะหมายความว่าผู้ใช้จะต้องจดจำ 'สถานะ' ของผู้ใช้สำหรับการเชื่อมต่อครั้งล่าสุดและ / หรือคงการเชื่อมต่อแบบเปิดไปยังผู้ร้องขอ นั่นจะมีราคาแพงมากและ 'เครียด' ในแอปพลิเคชันที่มีการเชื่อมต่อพร้อมกันนับพัน ...

การไร้สัญชาติในกรณีนี้มีการใช้ทรัพยากรอย่างมีประสิทธิภาพอย่างเห็นได้ชัด ... กล่าวคือรองรับการเชื่อมต่อในการร้องขอและการตอบกลับในกรณีเดียว ... ไม่มีค่าใช้จ่ายในการเปิดการเชื่อมต่อและ / หรือจดจำสิ่งใด ๆ จากคำขอสุดท้าย ...


-3

เราทำให้ Webapps มีสถานะสมบูรณ์โดยการลบล้างพฤติกรรมไร้สถานะของ HTTP โดยใช้วัตถุเซสชันเมื่อเราใช้สถานะ objets เซสชันจะดำเนินการ แต่เรายังคงใช้ HTTP เท่านั้น


-3

ฉันมีข้อสงสัยเหมือนกันเกี่ยวกับการออกแบบชนชั้นที่ไร้สัญชาติ v / s และได้ทำการวิจัยบางอย่าง เพิ่งเสร็จสิ้นและสิ่งที่ฉันค้นพบถูกโพสต์ในบล็อกของฉัน

  • คลาสเอนทิตีต้องมีสถานะ
  • คลาสผู้ช่วย / ผู้ปฏิบัติงานไม่ควรเป็นสถานะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.