【问题标题】:How to organize classes for an Angular application?如何为 Angular 应用程序组织类?
【发布时间】:2018-11-25 00:00:34
【问题描述】:

使用 TypeScript、JavaScript、Java 或其他任何类中的类来处理 API 响应的最专业方法是什么?

例如,一个应用程序需要三个资源:

  • 帐户(API:/account/:id)
  • 汽车(API:/account/:id/cars/[:id])
  • 驱动程序(API:/account/:id/cars/:id/drivers)

每个帐户都有一个或多个汽车,每个汽车都有一个或多个Driver

我在我的应用程序中看到了两种处理这些资源的方法:

  1. 为每个资源(帐户、汽车、司机)创建一个类并嵌套它。例如。

    class Account {
      constructor(
        public id: number,
        public name: string,
        public age: number
        public cars: Car[]
      ) {}
    }
    
    class Car {
      constructor(
        public id: number,
        public type: string,
        public seats: number
        public drivers: Driver[]
      ) {}
    }
    

    在这种情况下,API 将返回一个已经嵌套的 JSON 响应,并且只需要请求一次数据。

  2. 为每个资源创建一个类但不要嵌套它。首先只获取帐户数据(调用 /account/1234),然后在应用程序生命周期的后期获取司机(如果需要)和汽车(如果需要)。

    class Account {
      constructor(
        public id: number,
        public name: string,
        public age: number
      ) {}
    }
    
    class Car {
      constructor(
        public id: number,
        public type: string,
        public seats: number
      ) {}
    }
    

    在这种情况下,API 将为每个 API 调用仅返回主要资源数据。

那么资源是否应该始终嵌套在整个应用程序上并仅在一次调用,或者资源类是否应该存在并在应用程序中相互独立地重新加载?专业程序员使用哪种方式?

【问题讨论】:

  • 为什么首先需要创建类?您打算向他们添加什么行为?如果您不打算添加方法,则这些类并不是必需的;你最好为资源定义 TypeScript 接口。
  • 你的问题内容与 Angular 班级组织无关。您要问的是 API 设计;你在 Angular 中的 DTO 类/接口应该反映你从后端得到的东西。
  • 这是模棱两可的。在设计时,您还必须考虑如何使用数据以及数据集在一次点击中可能有多大。嵌套在小型数据集上会很好,但如果数据集总是很大,你不会想这样做。(想想网络流量,然后乘以可能使用你网站的用户数量)。
  • 这只是一个意见。我喜欢在服务器(而不是在客户端)中进行艰苦的工作,所以,我的第一个方法是 API 返回嵌套类。但是您可以需要在您的应用程序中查看所有汽车或所有司机。根据数据的大小,会有一个嵌套类的服务。好吧,我们说的是类(使用接口,因为你不需要对象的方法,只需要数据)

标签: javascript angular api class structure


【解决方案1】:

A class is unsuitable for declaring a type that represents an HTTP response. Use interface or type instead

来自 Angular 风格指南

考虑为数据模型使用接口

Angular 4.3 引入了新的更简单的方法来使用 HttpClient 库处理 http 请求

您可以告诉HttpClient 响应的类型以进行消费 输出更容易,更明显。 您需要做的就是为响应的形状定义一个接口并针对该接口进行类型检查:

    interface Post {
      title: string;
      body: string;
    };

    // ...

    constructor(private http: HttpClient) {}

    getData() {
      this.http.get<Post>(this.url).subscribe(res => {
        this.postTitle = res.title;
      });

}

因此,资源是否应该始终嵌套在整个应用程序中,并且 仅一次调用,或者资源类是否存在并且 在应用程序中相互独立地重新加载?专业程序员使用哪种方式?

这完全取决于你的用例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多