MST

星途 面试题库

面试题:C++复杂场景下switch语句参数限制分析

假设你正在开发一个图形渲染引擎,有一个枚举类型ShapeType表示不同的图形类型(如圆形、矩形、三角形等),在处理图形绘制逻辑时使用switch语句。同时,你希望在未来可能扩展到支持3D图形类型(通过一个新的枚举扩展)。请分析在这种复杂业务场景下,switch语句参数类型限制会带来哪些潜在问题,以及如何在遵循参数限制的前提下,设计一个良好的可扩展性架构。
44.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

switch语句参数类型限制带来的潜在问题

  1. 扩展性受限:当需要添加新的3D图形类型时,由于switch语句参数类型固定为现有的ShapeType枚举,若新类型无法直接融入该枚举,需要修改枚举定义,可能影响到现有依赖该枚举的其他代码。
  2. 代码耦合度高:每个图形类型的绘制逻辑都写在同一个switch语句块中,若某一图形类型的绘制逻辑发生较大变化,可能影响到其他图形类型的代码,维护成本增加。
  3. 可读性和可维护性降低:随着图形类型增多,switch语句块会变得庞大复杂,难以快速定位和理解特定图形类型的绘制逻辑。

遵循参数限制前提下的可扩展性架构设计

  1. 策略模式
    • 定义一个接口ShapeRenderer,包含一个draw方法。
    public interface ShapeRenderer {
        void draw();
    }
    
    • 为每种图形类型创建实现该接口的具体类,例如CircleRendererRectangleRenderer等。
    public class CircleRenderer implements ShapeRenderer {
        @Override
        public void draw() {
            // 圆形绘制逻辑
        }
    }
    
    • 在枚举ShapeType中添加一个属性,指向对应的渲染器实例。
    public enum ShapeType {
        CIRCLE(new CircleRenderer()),
        RECTANGLE(new RectangleRenderer());
    
        private ShapeRenderer renderer;
    
        ShapeType(ShapeRenderer renderer) {
            this.renderer = renderer;
        }
    
        public ShapeRenderer getRenderer() {
            return renderer;
        }
    }
    
    • 在绘制逻辑中,通过ShapeType获取对应的渲染器实例并调用draw方法。
    ShapeType shapeType = ShapeType.CIRCLE;
    shapeType.getRenderer().draw();
    
    • 当需要添加新的3D图形类型时,只需创建新的渲染器类实现ShapeRenderer接口,并在ShapeType枚举中添加新的枚举值和对应的渲染器实例,无需修改原有绘制逻辑的主体代码。
  2. 工厂模式辅助
    • 可以结合工厂模式,创建一个ShapeFactory类来创建不同类型的图形渲染器。
    public class ShapeFactory {
        public static ShapeRenderer createRenderer(ShapeType shapeType) {
            switch (shapeType) {
                case CIRCLE:
                    return new CircleRenderer();
                case RECTANGLE:
                    return new RectangleRenderer();
                default:
                    return null;
            }
        }
    }
    
    • 这样在绘制逻辑中,可以通过工厂方法获取渲染器。
    ShapeType shapeType = ShapeType.CIRCLE;
    ShapeRenderer renderer = ShapeFactory.createRenderer(shapeType);
    if (renderer != null) {
        renderer.draw();
    }
    
    • 当添加新的图形类型时,只需在ShapeFactorycreateRenderer方法的switch语句中添加新的分支,提高了代码的可维护性和可扩展性。