ค้นหาเว็บไซต์

วิธีการที่มีคำเตือน "method could be static" ถือว่าเป็นรูปแบบที่ไม่ดีใน JavaScript/TypeScript ไหม?


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

บางครั้งก็ดีที่จะสรุปโค้ดชิ้นใหญ่เป็นเมธอดแยก การทำเช่นนี้ถือเป็นการปฏิบัติที่ไม่ดีใน JavaScript/TypeScript หรือไม่?

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

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

//Change object array in *.content objects to values array
//noinspection JSMethodCanBeStatic
transformData(visibleData) {
    const ret: any = {};
    ret.headings = visibleData.headings;
    ret.checkbox = this.checkBox;                                                   //add if the table needs checkboxes
    ret.content = [];
    for (let i = 0; i < visibleData.content.length; i++) {
        ret.content.push(_.values(visibleData.content[i]));
    }
    return ret;
}

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

คำตอบ #1

โค้ดที่ไม่โต้ตอบกับอินสแตนซ์ควรเป็นฟังก์ชันอิสระหรืออย่างน้อยเป็นเมทอดสแตติกของคลาสเมื่อคุณเชื่อว่ามันเชื่อมโยงอย่างแน่นหนากับ API ของคลาส

วิธีการเพิ่มเติมทุกวิธีที่คุณเพิ่มไปยัง API ต้องได้รับการสนับสนุน ดังนั้นคลาสที่ใหญ่กว่าจะต้องการการสนับสนุนมากกว่าคลาสที่เล็กกว่า ในบางภาษา เช่น Java คุณไม่สามารถมีฟังก์ชันฟรีได้ ดังนั้นคุณต้องแนบฟังก์ชันกับคลาสบางคลาส แต่ TypeScript และ JS มีความยืดหยุ่นมากกว่า ดังนั้นจึงไม่จำเป็นต้องทำให้ API ของคลาสสกปรก

และคุณอาจพิจารณามันจากมุมมองการปรับปรุงประสิทธิภาพ

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