พิจารณาสถานการณ์ที่คลาสใช้พฤติกรรมพื้นฐานวิธีการและอื่น ๆ แต่คลาสที่แตกต่างกันของคลาสนั้นอาจมีอยู่สำหรับการใช้ที่แตกต่างกัน ในกรณีเฉพาะของฉันฉันมีเวกเตอร์ (เวกเตอร์เรขาคณิตไม่ใช่รายการ) และเวกเตอร์นั้นสามารถใช้ได้กับพื้นที่ยูคลิดมิติ N- มิติใด ๆ (1 มิติ, 2 มิติ, ... ) คลาส / ประเภทนี้สามารถกำหนดได้อย่างไร?
นี่จะเป็นเรื่องง่ายใน C ++ ที่เทมเพลตของคลาสสามารถมีค่าจริงเป็นพารามิเตอร์ได้ แต่เราไม่มีความหรูหราใน Java
ทั้งสองวิธีที่ฉันสามารถคิดได้ว่าสามารถนำมาใช้เพื่อแก้ปัญหานี้คือ:
มีการดำเนินการของแต่ละกรณีที่เป็นไปได้ในเวลารวบรวม
public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 implements Vector { public final double x, y; public Vector2(double x, double y) { this.x = x; this.y = y; } @Override public double magnitude() { return Math.sqrt(x * x + y * y); } public double getX() { return x; } public double getY() { return y; } }
เห็นได้ชัดว่าการแก้ปัญหานี้ใช้เวลานานมากและเป็นที่น่าเบื่ออย่างยิ่งสำหรับรหัส ในตัวอย่างนี้ดูเหมือนจะไม่เลวร้ายเกินไป แต่ในรหัสที่แท้จริงของฉันฉันกำลังติดต่อกับเวกเตอร์ที่มีการใช้งานหลายแบบแต่ละอันมีขนาดสูงสุดถึงสี่มิติ (x, y, z และ w) ขณะนี้ฉันมีโค้ดมากกว่า 2,000 บรรทัดแม้ว่าแต่ละเวคเตอร์จะต้องการเพียง 500 เท่านั้น
การระบุพารามิเตอร์ที่รันไทม์
public class Vector { private final double[] components; public Vector(double[] components) { this.components = components; } public int dimensions() { return components.length; } public double magnitude() { double sum = 0; for (double component : components) { sum += component * component; } return Math.sqrt(sum); } public double getComponent(int index) { return components[index]; } }
น่าเสียดายที่วิธีนี้ทำให้ประสิทธิภาพของโค้ดแย่ลงส่งผลให้รหัส messier กว่าโซลูชันเดิมและไม่ปลอดภัยในการคอมไพล์เวลา ตัวอย่างเช่น).
ขณะนี้ฉันกำลังพัฒนาจริง ๆ ใน Xtend ดังนั้นหากมีโซลูชัน Xtend ใด ๆ พร้อมใช้งานพวกเขาก็จะยอมรับได้เช่นกัน