You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于自动生成Dart模型创建Clean Architecture下的HomeEntity?

Clean Architecture下的HomeEntity实现与实体创建原则

一、HomeEntity相关实体实现

根据你提供的自动生成模型,我们将其转换为Clean Architecture核心层的实体——核心层实体不依赖任何外部解析逻辑,仅保留业务所需的纯数据结构:

// 分页信息实体
class HomePagination {
  final int page;
  final int pageSize;
  final int pageCount;
  final int total;

  HomePagination({
    required this.page,
    required this.pageSize,
    required this.pageCount,
    required this.total,
  });
}

// 元数据实体
class HomeMeta {
  final HomePagination pagination;

  HomeMeta({required this.pagination});
}

// 图片格式实体
class HomeImageFormat {
  final String name;
  final String hash;
  final String? ext;
  final String? mime;
  final dynamic path;
  final int width;
  final int height;
  final double size;
  final String url;

  HomeImageFormat({
    required this.name,
    required this.hash,
    required this.ext,
    required this.mime,
    required this.path,
    required this.width,
    required this.height,
    required this.size,
    required this.url,
  });
}

// 图片格式集合实体
class HomeImageFormats {
  final HomeImageFormat thumbnail;
  final HomeImageFormat small;
  final HomeImageFormat? medium;
  final HomeImageFormat? large;

  HomeImageFormats({
    required this.thumbnail,
    required this.small,
    required this.medium,
    required this.large,
  });
}

// 图片详情实体
class HomeImageDetails {
  final String name;
  final dynamic alternativeText;
  final dynamic caption;
  final int width;
  final int height;
  final HomeImageFormats formats;
  final String hash;
  final String? ext;
  final String? mime;
  final double size;
  final String url;
  final dynamic previewUrl;
  final String provider;
  final dynamic providerMetadata;
  final DateTime createdAt;
  final DateTime updatedAt;

  HomeImageDetails({
    required this.name,
    required this.alternativeText,
    required this.caption,
    required this.width,
    required this.height,
    required this.formats,
    required this.hash,
    required this.ext,
    required this.mime,
    required this.size,
    required this.url,
    required this.previewUrl,
    required this.provider,
    required this.providerMetadata,
    required this.createdAt,
    required this.updatedAt,
  });
}

// 图片实体
class HomeImage {
  final int id;
  final HomeImageDetails details;

  HomeImage({
    required this.id,
    required this.details,
  });
}

// 计划项实体
class HomePlanItem {
  final int id;
  final String header;
  final String description;
  final bool added;
  final DateTime createdAt;
  final DateTime updatedAt;
  final DateTime publishedAt;
  final HomeImage image;

  HomePlanItem({
    required this.id,
    required this.header,
    required this.description,
    required this.added,
    required this.createdAt,
    required this.updatedAt,
    required this.publishedAt,
    required this.image,
  });
}

// 核心Home实体
class HomeEntity {
  final List<HomePlanItem> planItems;
  final HomeMeta meta;

  HomeEntity({
    required this.planItems,
    required this.meta,
  });
}

说明:

  • 把原模型中的通用命名(如Datum、Data)替换为业务相关名称(如HomePlanItem、HomeImage),增强可读性;
  • 移除了所有JSON解析相关的fromJson/toJson方法,这些属于数据层(如Repository层的Model)的职责,实体仅负责承载业务数据;
  • 将原枚举类型(Ext、Mime)改为字符串类型,避免实体依赖解析逻辑,保持纯粹性。

二、Clean Architecture下创建实体的核心原则

  1. 业务优先,剥离外部依赖

    • 实体是业务领域的核心数据载体,只保留业务逻辑需要的字段,不要添加JSON转换、数据库注解这类与业务无关的代码;
    • 实体要能脱离任何第三方框架或库独立存在,不能被外部依赖绑定。
  2. 坚持不可变性

    • 所有字段用final修饰,实体创建后状态不可修改,避免业务逻辑中出现意外的状态变更,提升代码稳定性和可预测性;
    • 构造器尽量使用必填参数,保证实体实例创建后就是完整可用的。
  3. 命名贴合业务场景

    • 避免使用Datum、Data这类通用命名,改用与业务相关的名称,让实体的业务含义一目了然,降低后期维护成本。
  4. 合理拆分嵌套结构

    • 对于深层嵌套的结构,拆分为独立的子实体(如把图片相关逻辑拆分为HomeImage、HomeImageDetails),但不要过度拆分导致结构零散;
    • 可根据业务需求适当扁平化冗余嵌套,比如如果业务不需要图片的id,可以直接将详情字段合并到图片实体中。
  5. 明确手动输入字段的位置

    • 若存在需要手动输入的字段(如你提到的added),直接在实体中声明并在构造器中提供输入入口,由业务逻辑层负责为这些字段赋值。

内容的提问来源于stack exchange,提问作者Daniil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:01:23