HarmonyOS 鸿蒙Next建议使用class接收接口数据,因为interface不能逻辑复用与封装,直接使用又容易出现类型安全问题而导致APP闪退。

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next建议使用class接收接口数据,因为interface不能逻辑复用与封装,直接使用又容易出现类型安全问题而导致APP闪退。

很多人讲,请求接口数据要为每个接口特地写一个类很麻烦,这里用一个示例聊聊不使用类与使用类的区别。

import { plainToClass } from ‘class-transformer’

class Ohter { dateofBirth: string = “” }

class User { name: string = “” ohter?: Ohter

getAge() { if(!this.ohter){ return ‘数据异常’ } const today = new Date(); const birthDate = new Date(this.ohter.dateofBirth); let age = today.getFullYear() - birthDate.getFullYear(); return age; } }

@Entry @Component struct Page043 { userJson: string = { <span class="hljs-string"><span class="hljs-string">"name"</span></span>:<span class="hljs-string"><span class="hljs-string">"张三"</span></span>,<span class="hljs-string"><span class="hljs-string">"ohter"</span></span>:{<span class="hljs-string"><span class="hljs-string">"dateofBirth"</span></span>:<span class="hljs-string"><span class="hljs-string">"2000-01-01"</span></span>}} userJson_2: string = { <span class="hljs-string"><span class="hljs-string">"name"</span></span>:<span class="hljs-string"><span class="hljs-string">"李四"</span></span> }

build() { Column() { Button(‘测试’).onClick(() => { //方案一:直接使用JSON.parse+[] ,服务端数据正常时 const today = new Date(); const birthDate = new Date(JSON.parse(this.userJson)[‘ohter’][‘dateofBirth’]); let age = today.getFullYear() - birthDate.getFullYear();

    console.info(`姓名:${<span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson)[<span class="hljs-string"><span class="hljs-string">'name'</span></span>]}`)
    console.info(`年龄:${age}`)
  })
  Button(<span class="hljs-string"><span class="hljs-string">'测试2'</span></span>).onClick(() =&gt; {
    <span class="hljs-comment"><span class="hljs-comment">//方案二:将数据处理封装到class内</span></span>
    <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> users: User = plainToClass(User, <span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson))
    console.info(`姓名:${users.name}`)
    console.info(`年龄:${users.getAge()}`)
  })
  Button(<span class="hljs-string"><span class="hljs-string">'测试3'</span></span>).onClick(() =&gt; {
    <span class="hljs-comment"><span class="hljs-comment">//方案三:直接使用JSON.parse+[] ,服务端数据异常时,闪退</span></span>
    <span class="hljs-keyword"><span class="hljs-keyword">const</span></span> today = <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Date</span></span>();
    <span class="hljs-keyword"><span class="hljs-keyword">const</span></span> birthDate = <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Date</span></span>(<span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson_2)[<span class="hljs-string"><span class="hljs-string">'ohter'</span></span>][<span class="hljs-string"><span class="hljs-string">'dateofBirth'</span></span>]);
    <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> age = today.getFullYear() - birthDate.getFullYear();

    console.info(`姓名:${<span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson)[<span class="hljs-string"><span class="hljs-string">'name'</span></span>]}`)
    console.info(`年龄:${age}`)

  })
  Button(<span class="hljs-string"><span class="hljs-string">'测试4'</span></span>).onClick(() =&gt; {
    <span class="hljs-comment"><span class="hljs-comment">//方案四:将数据处理封装到class内 ,服务端数据异常时</span></span>
    <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> users: User = plainToClass(User, <span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson_2))
    console.info(`姓名:${users.name}`)
    console.info(`年龄:${users.getAge()}`)

  })
}
.width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
.height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)

} }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

方案一没使用任何框架,也不需要为接口写类, [] 就能拿到数据,拿到后,需要自己获取一下年,做减法,才能知道这个人的真实年龄。这是最正常的写法。

方案二相比方案一,体验了封装class的好处,可以把复杂的逻辑封装到class内,而不必把一堆逻辑代码暴露在page内。

方案三体现了方案一的缺点,万一接口数据给的不正常,方案一这种很容易拿不到数据,导致app崩溃

方案四体现了class的另一个好处,就是可以在内部事先加判断,避免接口数据不正确而导致app崩溃

【总结】使用class的好处是

1、代码可读性和维护性提升:可以对属性添加注释、使得开发者能够更容易理解数据的组成和用途,这对于团队协作和长期维护是非常有利的。

2、类型安全:通过类的定义提前预防这类错误,而不是在运行时遭遇异常或“闪退”。

3、逻辑复用与封装:数据处理逻辑被集中在一处,便于修改和复用。

4、易于扩展和继承:类支持继承,允许你基于现有类创建更具体的子类,轻松添加或覆盖功能。这为软件的未来扩展提供了便利。

5、错误处理更加优雅:提高了应用的健壮性。



关于HarmonyOS 鸿蒙Next建议使用class接收接口数据,因为interface不能逻辑复用与封装,直接使用又容易出现类型安全问题而导致APP闪退。的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

1 回复

Data -> 不带方法的 Object -> 带方法的Class
粗糙理解: Data -> Model -> ViewModel -> View

 

回到顶部