วัตถุคำขอ HTTP / ตอบสนองควรจะไม่เปลี่ยนรูป?


10

ฉันคิดว่ามันปลอดภัยที่จะบอกว่าเว็บแอปพลิเคชั่นส่วนใหญ่มีพื้นฐานมาจากกระบวนทัศน์คำขอ / การตอบสนอง PHP ไม่เคยมีสิ่งที่เป็นนามธรรมของวัตถุเหล่านี้ กลุ่มหนึ่งพยายามแก้ไขสิ่งนี้: https://github.com/php-fig/fig-standards/blob/master/proposed/http-message.md

อย่างไรก็ตามพวกเขาได้รับการติดตามด้านการเปลี่ยนแปลงไม่ได้ ในอีกด้านหนึ่งวัตถุขอ / ตอบสนองโดยทั่วไปต้องการการเปลี่ยนแปลงเพียงเล็กน้อยระหว่างวงจรชีวิตของพวกเขา ในทางกลับกันวัตถุตอบสนองโดยเฉพาะอย่างยิ่งมักจะต้องการส่วนหัว HTTP ที่จะเพิ่ม

นอกจากนี้ความไม่สามารถเปลี่ยนแปลงได้นั้นไม่เคยเกิดขึ้นในดินแดนของ PHP

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


สมมติว่าคุณส่งคืนวัตถุ json

$response = new JsonResponse($item);

ดีและเรียบง่าย แต่ปรากฎว่าการร้องขอนั้นเป็นการร้องขอ Cross-Origin Resource Sharing (CORS) รหัสที่สร้างการตอบสนองไม่ควรสนใจ แต่บางแห่งดาวน์สตรีมเป็นกระบวนการที่จะเพิ่มส่วนหัวควบคุมการเข้าถึงที่จำเป็น มีข้อได้เปรียบใด ๆ ในการรักษาการตอบกลับดั้งเดิมและสร้างขึ้นใหม่ด้วยส่วนหัวเพิ่มเติมหรือไม่ หรือเป็นคำถามเกี่ยวกับสไตล์การเขียนโปรแกรมอย่างเคร่งครัด

วัตถุคำขอมีความน่าสนใจขึ้นอีกเล็กน้อย มันเริ่มต้นเหมือนกัน:

$request = new Request('incoming request information including uri and headers');

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

$request->setAttribute('action',function() {});

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


หากเป็นเพียงคำขอ / การตอบกลับดั้งเดิมที่คุณต้องการเราสามารถจัดเก็บโคลนของวัตถุที่ได้รับการตั้งค่าใน c'tor และจากนั้นจะไม่ได้รับการสัมผัสอีกครั้ง คุณสามารถกลายพันธุ์ได้ แต่ยังสามารถเข้าถึงต้นฉบับได้เมื่อต้องการ นี่น่าจะเป็น IMO ที่ดีกว่า
mpen

คำตอบ:


4

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

ฉันเห็นด้วยกับคำสั่ง @ MainMa ของ " ฉันไม่แน่ใจว่าประโยชน์เล็กน้อยของการอ่านชดเชยการขาดความยืดหยุ่นที่เป็นไปได้ " และโดยส่วนตัวฉันไม่เห็นแง่มุมที่เป็นประโยชน์และเป็นประโยชน์ในการบังคับให้PHP HTTP RequestวัตถุPHP HTTP Responseชั่วคราวหรือวัตถุชั่วคราวเปลี่ยนรูป

มีประสบการณ์เกี่ยวกับการจัดการกับข้อกำหนดประเภทใดบ้าง

  1. Windows Presentation Foundationกรอบงานของ Microsoft แนะนำแนวคิดของวัตถุที่ว่างเปล่า เมื่อแช่แข็งวัตถุดังกล่าวจะกลายเป็น

    • ไม่เปลี่ยนรูป (โยนข้อยกเว้นเมื่อพยายามปรับเปลี่ยน)
    • ใช้งานได้เร็วขึ้น (ผู้ได้รับทรัพย์สินไม่จำเป็นต้องทำอะไรที่แฟนซีว่า "สิ่งที่มีค่าของฉันคืออะไร" ตัดสินใจได้มากกว่านี้)
    • การใช้หน่วยความจำน้อยลง (โครงสร้างข้อมูลตัวช่วยภายในและแคช ฯลฯ สามารถลดลงได้มากที่สุดเพื่อประหยัดเวลาและพื้นที่แทน)
    • และแบ่งปันได้

    แม้ว่ามันจะถูกใช้เป็นการปรับแต่งความเร็ว GUI แต่แนวคิดนี้สามารถนำไปใช้ได้ในที่อื่นรวมถึงประโยชน์ของมัน

  2. Nancy("มีน้ำหนักเบา, มีกรอบต่ำ, กรอบสำหรับการสร้างบริการบน HTTP บน. Net และ Mono") อธิบายถึงประโยชน์ของความไม่สามารถเปลี่ยนแปลงได้ในการคอมเม้นท์หนึ่งในคอมเม้นท์ดังนี้

    ... เราสามารถสันนิษฐานได้ว่าแคชของเรานั้นไม่เปลี่ยนรูปหากพวกเขาปิดซึ่งหมายความว่าเราไม่มีการล็อคประสิทธิภาพที่เร็วขึ้น (แม้ว่าการโจมตีจะไม่มาก) ...

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

ข้างต้นอาจดูเหมือนคำตอบนอกหัวข้อ แต่ฉันไม่รู้อะไรเลยและนั่นเป็นสาเหตุที่ฉันคิดว่าความต้องการที่ไม่สามารถเปลี่ยนแปลงได้นั้นเป็นปัญหาที่เกิดขึ้นเอง


1
ขอบคุณ คำตอบทั้งคู่เป็นข้อมูล ฉันตัดสินใจที่จะยอมรับของคุณเพราะความคิดของวัตถุแช่แข็งช่วยอธิบายความคิดของฉัน การสร้างวัตถุตอบสนองที่ถูกทำให้เยือกแข็งไม่เปลี่ยนแปลงเป็นบางจุดก่อนที่จะส่งการโคลนและยกเลิกการลบวัตถุ สามารถเพิ่มส่วนเสริมของส่วนหัวที่เน้นการส่ง (แคชเป็นต้น) จากนั้นวัตถุสามารถถูกแช่แข็งและส่งไปได้
Cerad

7

วัตถุที่ไม่เปลี่ยนรูปโดยทั่วไปมีประโยชน์หลายประการ

  • สิ่งที่สำคัญที่สุดคือความง่ายในการใช้ออบเจ็กต์ที่ไม่เปลี่ยนรูปแบบในการประมวลผลแบบขนาน นอกจากนี้ยังอธิบายว่าทำไม"เปลี่ยนไม่ได้ไม่เคยติดจริงๆในแผ่นดินของ PHP"

  • ความมั่นคงของรัฐง่ายกว่าที่จะได้รับ

  • วัตถุนั้นง่ายและเป็นธรรมชาติมากกว่าที่จะทำงานด้วย

สิ่งสำคัญคือจำนวนวัตถุที่ควรเปลี่ยนแปลงในช่วงเวลาชีวิตของมัน - การเปลี่ยนแปลงทุกอย่างกับวัตถุที่ไม่เปลี่ยนรูปนั้นจำเป็นต้องสร้างตัวอย่างเพิ่มเติมซึ่งอาจมีราคาแพงเกินไปอย่างรวดเร็วในแง่ของหน่วยความจำ (และอาจเป็นรอบ CPU เช่นกัน) นี่คือเหตุผลว่าทำไมภาษาโปรแกรมส่วนใหญ่ที่stringไม่สามารถเปลี่ยนแปลงได้กลายเป็นคลาสอื่นสำหรับสตริงที่ไม่แน่นอนเช่นStringBuilderใน C # เพื่อตอบสนองต่อสถานการณ์ที่สตริงถูกตัดแบ่งจากส่วนเล็ก ๆ หลายส่วนแต่ละส่วนเพิ่มแบบไดนามิก

ในไลบรารีฝั่งไคลเอ็นต์ (การส่งคำร้องขอ HTTP และรับการตอบกลับ) ทำให้เหมาะสมที่จะทำให้การร้องขอ HTTP และการตอบสนองไม่เปลี่ยนรูปได้: ในขณะที่คำขอบางอย่างสามารถสร้างด้วยอินเตอร์เฟสที่คล่องแคล่วนี่ไม่ใช่การใช้งานที่สำคัญ การตอบสนองจะไม่เปลี่ยนแปลงอย่างไรก็ตามความไม่สามารถเปลี่ยนแปลงได้จึงสมเหตุสมผล

ในไลบรารีฝั่งเซิร์ฟเวอร์ (รับคำขอ HTTP และส่งคำตอบ) ในขณะที่คำขอสามารถเปลี่ยนรูปได้ฉันไม่แน่ใจว่าสามารถตอบสนองได้หรือไม่ ข้อมูลสามารถเป็นสตรีมได้ (ซึ่งสำหรับบางคน - ดูด้านล่าง - บังคับให้วัตถุตอบสนองไม่แน่นอน) และส่วนหัวสามารถเพิ่ม "แบบทันที" ในระหว่างการเรียกใช้สคริปต์จนกว่าการตอบสนองจะเริ่ม ถูกส่งไปยังลูกค้า

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

ให้แน่ใจว่าคุณยังอ่านบทความที่สมบูรณ์มากขึ้นโดยปลิ้นหม้อเกี่ยวกับ PSR-7 บทความอธิบายหมู่คนกว่าหนึ่งในกรณีที่ไม่เปลี่ยนรูปดังกล่าวเป็นปัญหาคือการตอบสนองยาวซึ่งควรจะสตรีม โดยส่วนตัวแล้วฉันไม่เห็นประเด็น: IMHO ไม่มีสิ่งใดที่ห้ามไม่ให้วัตถุที่ไม่เปลี่ยนรูปแบบมีสตรีม (ตัวอย่างเช่นFileReaderวัตถุสามารถเปลี่ยนแปลงไม่ได้แม้ว่าจะอ่านไฟล์ซึ่งสามารถเปลี่ยนแปลงได้ตลอดเวลา) เฟรมเวิร์กของ Python Flask ใช้วิธีการที่แตกต่างกันเมื่อมันมาถึงการตอบสนองขนาดใหญ่ (หรือการตอบสนองที่ต้องใช้เวลาในการสร้าง) โดยการส่งกลับ iterator


1
ข้อดีอย่างหนึ่งซึ่งเป็นมูลค่าการกล่าวถึง IMO ก็คือเมื่อคุณมีวัตถุที่ไม่เปลี่ยนรูปแบบคุณไม่จำเป็นต้องถามตัวเองว่าคุณกำลังทำงานกับสำเนาส่วนตัวหรือไม่คุณสามารถเปลี่ยนได้อย่างอิสระหรืออ้างอิงจากวัตถุอื่นที่การเปลี่ยนแปลงอาจส่งผลต่อวัตถุอื่น ๆ
ฟิลิปป์

@ ฟิลิป: IMHO หนึ่งในข้อบกพร่องที่ใหญ่ที่สุดใน Java.NET คือการขาดการประชุมเพื่อแยกความแตกต่างระหว่างวิธีการที่กลับมาอ้างอิงถึงวัตถุใหม่ที่ผู้โทรสามารถเปลี่ยนแปลงได้ตามความประสงค์เมื่อเทียบกับผู้ที่กลับมาอ้างอิงซึ่งแนบมาหรือแค็ปซูลภายใน สถานะที่อาจถูกปรับเปลี่ยนเพื่อจัดการกับสถานะนั้นและผู้ที่ส่งคืนการอ้างอิงไปยังวัตถุที่อาจหรืออาจจะแนบกับสถานะภายใน มันเป็นไปไม่ได้ที่จะเขียนโค้ดที่มีประสิทธิภาพและมีประสิทธิภาพโดยไม่ทราบว่าสิ่งอ้างอิงประเภทใดที่ควรจะส่งคืน แต่ไม่มีข้อตกลงที่จะระบุว่า
supercat

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