gpt4 book ai didi

java - 如何更好地创建复杂类的实例?

转载 作者:行者123 更新时间:2023-12-02 06:00:30 26 4
gpt4 key购买 nike

作为新手,我正在开发一款游戏,但对创建复杂对象的更好方法感到困惑。这个问题可以是关于OOP、设计模式和SOLID原则。对于这些问题,编程语言几乎没有限制。

情况很清楚:

  1. 一艘战舰由一个船体和多个炮塔组成。
  2. 一个炮塔由一个盾牌和多个炮管组成。

背景

我正在使用 Pixi.js 和 TypeScript 开发基于浏览器的 2D 游戏。以下类继承自 Pixi.js 的原生类 Sprite 或 Container,但为了清楚起见,我在下面的代码中省略了这些扩展子句。

代码

我可以简单地想出下面的 Barrel、Shield 和 Body 代码:(在 TypeScript 中,但与 Java 和 C# 没有什么区别,不是吗?)

class Barrel {
constructor(texture, x, y, rotation){
/*...*/
}
}
class Shield {
constructor(texture, x, y, rotation){
/*...*/
}
}
class Body {
constructor(texture, x, y, rotation){
/*...*/
}
}

问题来了,炮塔和战舰呢?

粗略地说,1个炮塔=1个盾牌+N个炮管,1个战舰=1个机体+N个炮塔。

无需进一步详细思考,可以轻松得到以下代码:

class Turret {
private shield: Shield
private barrels: Barrel[]
constructor(x, y, rotation, shieldCfg, barrelCfgList) {
/*...*/
this.shield = new Shield(shieldCfg.texture, shieldCfg.x, shieldCfg.y, shieldCfg.rotation)
for(let cfg of barrelCfgList){
const barrel = new Barrel(cfg.texture, cfg.x, cfg.y, cfg.rotation)
this.barrels.push(barrel)
}
}
}

class Warship {
private body: Body
private turrets: Turret[]
constructor(x, y, rotation, bodyCfg, turretCfgList) {
/*...*/
this.body = new Body(bodyCfg.texture, bodyCfg.x, bodyCfg.y, bodyCfg.rotation)
for(let cfg of turretCfgList){
const turret = new Turret(cfg.x, cfg.y, cfg.rotation, cfg.shieldCfg, cfg.barrelCfgList)
this.turrets.push(turret)
}
}
}

不难想象turretCfgList有多复杂。

const turretCfgList = [
{
x: 1,
y: 2,
rotation: 3.14,
shieldCfg: {
texture: 'gun-shield'
x: 4,
y: 5,
rotation: 6.28
},
barrelCfgList: [
{
texture: 'gun-barrel'
x: 7,
y: 8,
rotation: 9.42
},
/*...*/
]
},
/*...*/
]

我的问题是:

  1. 如何解决上面嵌套对象的复杂参数?
  2. 上面的原始代码与工厂方法模式、构建器模式等更好的解决方案相比有哪些改进?

非常感谢。

我不太确定是否使用下面的代码。仅供引用。

  1. 传递一个复杂的配置对象而不是复杂的参数。
class Turret {
// constructor(texture, x, y, rotation, shieldCfg, barrelCfgList) {}
constructor(cfg) {
/*...*/
this.shield = new Shield(cfg.shieldCfg.texture, cfg.shieldCfg.x, shieldCfg.y, cfg.shieldCfg.rotation)
for(let barrelCfg of barrelCfgList){
const barrel = new Barrel(cfg.barrelCfg.texture, cfg.barrelCfg.x, cfg.barrelCfg.y, cfg.barrelCfg.rotation)
this.barrels.push(barrel)
}
}
}
  • 在其他地方创建组件实例,并传递这些实例而不是参数
  • class Turret {
    // constructor(texture, x, y, rotation, shieldCfg, barrelCfgList) {}
    constructor(x, y, rotation, shield, barrels) {
    /*...*/
    this.shield = shield
    this.barrels = barrels
    }
    }
  • 工厂方法模式?
  • 构建器模式?
  • ??

    • 更新1,添加一些关于背景的说明。
  • 最佳答案

    最好的方法是使用Entity Component System 。它最适合游戏开发,并为您提供了将系统的不同部分组合到一个单元/建筑物/其他游戏对象中的绝佳机会。您可以使用任何方式来组合它:特定类、工厂或构建器。

    关于java - 如何更好地创建复杂类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980956/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com