HarmonyOS鸿蒙Next个人开发代码优化疑问

HarmonyOS鸿蒙Next个人开发代码优化疑问

因为以前没写过TS语言,刚刚写懒加载的时候发现了一个官方示例有点没太懂,例如BasicDataSource类实现了IDataSource,

集合的类型private originDataArray: Diary[] = [],集合的类型我是写了我自己的日记类Diary

export class BasicDataSource implements IDataSource {
  private listeners: DataChangeListener[] = [];
  private originDataArray: Diary[] = [];

  public totalCount(): number {
    return this.originDataArray.length;
  }

  public getData(index: number): Diary {
    return this.originDataArray[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      console.info('add listener');
      this.listeners.push(listener);
    }
  }
}

到这一步我有点疑问就是BasicDataSource这个类正常应该是公共的吧,但是他的接受的类型就是我的Diary,导致只能这个地方用,还是说我想用另一个对象的时候再新增一个变量,然后类型传另一个对象,我在写一个MyDataSource2,去继承BasicDataSource,对这个地方有点不太懂,不知道怎么写才更优雅

export class MyDataSource extends BasicDataSource {
  private dataArray: Diary[] = [];
  public initData(): Diary[] {
    //调数据库查询
    return this.dataArray=[];
  }
  public totalCount(): number {
    return this.dataArray.length;
  }

  public getData(index: number): Diary {
    return this.dataArray[index];
  }

  public pushData(data: Diary): void {
    this.dataArray.push(data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }
}

更多关于HarmonyOS鸿蒙Next个人开发代码优化疑问的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

用泛型

export class BaseDataSource<T> implements IDataSource

更多关于HarmonyOS鸿蒙Next个人开发代码优化疑问的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


忘记了范型的存在哈哈哈感谢,

可以使用 Object 类,在相关业务中再 as Diary

private dataArray: Object[] = [];

我直接定义object类型这样可以不,我发现目前还没报错

private originDataArray: object[] = [];

鸿蒙Next开发代码优化建议:

  1. 使用ArkTS替代JS/TS提升性能;

  2. 合理运用Stage模型的生命周期管理;

  3. 优先调用HarmonyOS原生API;

  4. 减少UI主线程耗时操作;

  5. 利用分布式能力优化跨设备交互逻辑;

  6. 采用组件化开发模式。注意内存管理,避免频繁创建对象。

针对你的HarmonyOS Next开发中的代码优化疑问,这里给出TS泛型的解决方案:

建议使用TypeScript泛型改造BasicDataSource,使其支持不同类型的数据:

export class BasicDataSource<T> implements IDataSource {
  private listeners: DataChangeListener[] = [];
  protected originDataArray: T[] = []; // 改为protected便于子类访问

  public totalCount(): number {
    return this.originDataArray.length;
  }

  public getData(index: number): T {
    return this.originDataArray[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      this.listeners.push(listener);
    }
  }
}

使用时可以这样继承:

export class DiaryDataSource extends BasicDataSource<Diary> {
  public initData(): void {
    // 初始化日记数据
  }
}

export class OtherDataSource extends BasicDataSource<OtherType> {
  // 其他类型的数据源
}

这种泛型方案的优势:

  1. 保持基础数据源逻辑复用
  2. 支持任意类型的数据项
  3. 类型安全,编译时检查
  4. 避免重复代码

对于懒加载场景,这种设计能更好地支持不同类型数据的加载需求。

回到顶部