การสำรวจ/แก้ไขโครงสร้างข้อมูล Groovy

ฉันกำลังพัฒนาโครงการที่จะอ่านข้อมูลบางอย่างในรูปแบบที่เป็นกรรมสิทธิ์ รวบรวมไว้ในโครงสร้างข้อมูล Groovy ที่รวมเป็นหนึ่งเดียว และเขียนออกมาในรูปแบบ XML เรียบร้อย (หรือ JSON ยังไม่ได้ตัดสินใจ) ฉันเป็นมือใหม่ของ Groovy แต่โปรเจ็กต์ที่เป็นโปรเจ็กต์ Ant build นั้น Groovy ดูเหมือนเป็นวิธีที่ดีที่สุด

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

เพื่อแสดงให้เห็น สมมติว่าเรารวบรวมข้อมูลของเราดังนั้นจึงเทียบเท่ากับ:

def inventory = {
    car (make: "Subaru", model: "Impreza WRX", year: 2010, color: "Blue") {
        feature ("Premium sound")
        feature ("Brembo brakes")
        bug ("Leaks oil")
        bug ("Needs new transmission")
    }
    car (make: "Jeep", model: "Wrangler", year: 13, awd: true) {
        feature ("Soft top")
        bug ("Doesn't start")
        bug ("Flooded")
    }
    // blahblahblah
}

และเรากำลังพยายามบรรลุเป้าหมายต่อไปนี้ เช่น:

  1. ลบรายการ "ข้อบกพร่อง" ทั้งหมด (สมมติว่าเรากำลังเขียนรายการเพื่อเผยแพร่บนเว็บไซต์ของตัวแทนจำหน่ายของเรา) หรือ "คุณสมบัติ" ทั้งหมด (หากเป็นสำหรับทีมซ่อมก่อนการขายของเรา)
  2. ดูรายการและตรวจสอบให้แน่ใจว่าแอตทริบิวต์ "ปี" ทั้งหมดเป็นตัวเลข 4 หลัก
  3. เลิกใช้แอตทริบิวต์ "awd" ทั้งหมด โดยย้ายไปที่รายการ "คุณลักษณะ"

ดังนั้นเราจึงได้โครงสร้างดังนี้:

def inventory = {
    car (make: "Subaru", model: "Impreza WRX", year: 2010, color: "Blue") {
        feature ("Premium sound")
        feature ("Brembo brakes")
    }
    car (make: "Jeep", model: "Wrangler", year: 2013) {
        feature ("AWD")
        feature ("Soft top")
    }
    // blahblahblah
}

จริงๆ แล้ว ฉันก็โอเคที่จะผ่านโครงสร้างเดิมโดยสร้างรายการใหม่ (ข้อมูลของฉันไม่ใหญ่มากจนต้องมีการแก้ไขแบบแทนที่) แต่ฉันจะสำรวจโครงสร้างนี้ตั้งแต่แรกได้อย่างไร

โอ้และคำถามเกี่ยวกับคำศัพท์ บางทีฉันแค่ค้นหาคีย์เวิร์ดผิดใน Google... เอนทิตีนี้ตามที่กำหนดไว้ในโค้ด: มันถูกเรียกว่า "การปิด" ด้วยหรือมีคำอื่นสำหรับมันหรือไม่


person Andy Kovtun    schedule 23.04.2015    source แหล่งที่มา
comment
เนื่องจากโค้ด ไม่มี ข้อมูลเป็นแบบ Groovy คุณจะต้องทำการแปลงก่อนหรือหลัง DSL ของคุณที่นั่น ณ ตอนนี้ยังไม่ชัดเจนจริงๆ ว่าทั้งหมดนี้เชื่อมโยงกันอย่างไรและเมื่อเป็นตัวแทนระดับกลาง โค้ด Groovy ข้างต้นของคุณเป็นอย่างไร มีใครเขียนมันและคุณก็เรียกใช้มันในตัวสร้างมาร์กอัปหรือไม่   -  person cfrick    schedule 23.04.2015


คำตอบ (1)


เมื่อดูที่ inventory จริงๆ แล้วมันสามารถแสดงได้ด้วยสิ่งที่ต้องการ

@Immutable(copyWith = true)
class Car {
    String make
    String model
    int year
    String color
    boolean awd

    List<String> features
    List<String> bugs
}

เมื่อคุณพอใจกับการเขียนรายการใหม่แล้ว (และโดยทั่วไปมีเหตุผลบางประการที่จะไม่ทำเช่นนั้น) คุณสามารถเพิ่มคำอธิบายประกอบ @Immutable ได้ เนื่องจากเป็น "ผลข้างเคียง" คุณสามารถเพิ่ม copyWith = true เพื่อรับวิธีการคัดลอกได้

คำจำกัดความของ inventory อาจมีลักษณะดังนี้:

    def inventory = [
        new Car(
            make: "Subaru",
            model: "Impreza WRX",
            year: 2010,
            color: "Blue",
            features: ["Premium sound", "Brembo brakes"],
            bugs: ["Leaks oil", "Needs new transmission"]),
        new Car(
            make: "Jeep",
            model: "Wrangler",
            year: 13,
            awd: true,
            features: ["Soft top"],
            bugs: ["Doesn't start", "Flooded"])
        ]

ซึ่งให้การแสดงข้อมูลของคุณอย่างไม่เปลี่ยนแปลง จากนั้น คุณสามารถสำรวจและเปลี่ยนแปลงข้อมูลของคุณโดยใช้ API การรวบรวม ในกรณีของคุณ:

    def result = inventory
        .collect { it.copyWith(bugs: []) }
        .collect { it.copyWith(year: 
                     it.year < 2000 ? it.year + 2000 : it.year) }
        .collect {
            if (it.awd) { 
                it.copyWith(features: it.features + "AWD")
            } else {
                it
            } 

การเปลี่ยนแปลงแต่ละครั้งจะถูกนำไปใช้แยกกัน (และมีเพียงอินสแตนซ์ที่ไม่เปลี่ยนรูปแบบเท่านั้นที่ไหลผ่านไปป์ไลน์นั้น)


หากคุณต้องการลบรายการข้อบกพร่องที่ว่างเปล่าและ/หรือคุณสมบัติ awd ให้กำหนดคลาสเป้าหมาย:

class FixedCar {
    String make
    String model
    int year
    String color

    List<String> features

    static FixedCar apply(Car car) {
        new FixedCar(
            make: car.make,
            model: car.model,
            year: car.year,
            color: car.color,
            features: car.features)
    }
}

และเพิ่มการโทรอีกครั้งไปที่ collect:

    def result = inventory
        .collect { it.copyWith(bugs: []) }
        .collect { it.copyWith(year: 
                     it.year < 2000 ? it.year + 2000 : it.year) }
        .collect {
            if (it.awd) { 
                it.copyWith(features: it.features + "AWD")
            } else {
                it
            } 
        }.collect { FixedCar.apply(it) }
person Beryllium    schedule 27.04.2015