0

0

我不知道你可以使用同级参数作为函数中的默认值

聖光之護

聖光之護

发布时间:2024-10-13 19:15:29

|

504人浏览过

|

来源于dev.to

转载

我不知道你可以使用同级参数作为函数中的默认值

javascript 从 es2015 开始就支持默认参数值。你知道这一点。我知道这一点。我知道的是,您可以使用兄弟 参数作为默认值本身。 (或者也许是“相邻位置参数”?不知道如何称呼这些。)

function myfunc(arg1, arg2 = arg1) {
  console.log(arg1, arg2);
}

myfunc("arg1!");
// "arg1!" "arg1!"

这也适用于类构造函数 - 我发现这对于使一些 picperf.io 代码更具可测试性非常有帮助。为此目的使用简单的依赖注入是很常见的。让我们来探索一下。

一个场景

与图像优化主题保持一致,假设您有一个 optimizedimage 类。向其构造函数提供图像 url,您可以检索图像的新优化缓冲区或缓存版本。

class optimizedimage {
  constructor(
    imageurl: string,
    cacheservice = new cacheservice(),
    optimizeservice = new optimizeservice()
  ) {
    this.imageurl = imageurl;
    this.cacheservice = cacheservice;
    this.optimizeservice = optimizeservice;
  }

  async get() {
    const cached = this.cacheservice.get(this.imageurl);

    // return the previously optimized image.
    if (cached) return cached;

    const optimizedimage = await this.optimizeservice
      .optimize(this.imageurl);

    // cache the optimized image for next time.
    return this.cacheservice.put(this.imageurl, optimizedimage);
  }
}

const instance = new optimizedimage('https://macarthur.me/me.jpg');
const imgbuffer = await instance.get();

生产中使用的唯一构造函数参数是 imageurl,但注入 cacheservice 和 optimizeservice 可以更轻松地使用模拟进行单元测试:

import { it, expect, vi } from 'vitest';
import { optimizedimage } from './main';

it('returns freshly optimized image', async function () {
  const fakeimagebuffer = new arraybuffer('image!');
  const mockcacheservice = {
    get: (url) => null,
    put: vi.fn().mockresolvedvalue(fakeimagebuffer),
  };

  const mockoptimizeservice = {
    optimize: (url) => fakeimagebuffer,
  };

  const optimizedimage = new optimizedimage(
    'https://test.jpg',
    mockcacheservice,
    mockoptimizeservice
  );

  const result = await optimizedimage.get();

  expect(result).toequal(fakeimagebuffer);
  expect(mockcacheservice.put).tohavebeencalledwith(
    'https://test.jpg',
    'optimized image'
  );
});

让它变得更加复杂

在该示例中,这两个服务类仅在调用特定方法时才使用 imageurl。但想象一下,如果他们需要将其传递给自己的构造函数。您可能会想将实例化到 optimizedimage 的构造函数中(我就是这样):

class optimizedimage {
  constructor(
    imageurl: string
  ) {
    this.imageurl = imageurl;
    this.cacheservice = new cacheservice(imageurl);
    this.optimizeservice = new optimizeservice(imageurl);
  }

那是可行的,但现在 optimizedimage 完全负责服务实例化,测试也变得更加麻烦。传入服务实例的模拟并不是那么容易。

Python之模块学习 中文WORD版
Python之模块学习 中文WORD版

本文档主要讲述的是Python之模块学习;python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题。模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的模块(内置函数)不需要导入外。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

您可以通过传入模拟类定义来解决这个问题,但是您随后需要使用这些类自己的构造函数创建这些类的模拟版本,这使得测试变得更加乏味。幸运的是,还有另一种选择:在参数列表的其余部分中使用 imageurl 参数。

共享同级参数

直到不久前我才意识到这是可能的。它的外观如下:

export class optimizedimage {
  constructor(
    imageurl: string,
    // use the same `imageurl` in both dependencies.
    cacheservice = new cacheservice(imageurl),
    optimizeservice = new optimizeservice(imageurl)
  ) {
    this.cacheservice = cacheservice;
    this.optimizeservice = optimizeservice;
  }

  async get() {
    const cached = this.cacheservice.get();

    // return the previously optimized image.
    if (cached) return cached;

    const optimizedimage = await this.optimizeservice.optimize();

    // cache the optimized image for next time.
    return this.cacheservice.put(optimizedimage);
  }
}

通过此设置,您可以像以前一样轻松地模拟这些实例,并且类的其余部分甚至不需要保留 imageurl 本身的实例。当然,实例化仍然很简单:

const instance = new optimizedimage('https://macarthur.me/me.jpg');

const img = await instance.get();

相同的测试方法也保持不变:

import { it, expect, vi } from 'vitest';
import { OptimizedImage } from './main';

it('returns freshly optimized image', async function () {
  const mockCacheService = {
    get: () => null,
    put: vi.fn().mockResolvedValue('optimized image'),
  };

  const mockOptimizeService = {
    optimize: () => 'optimized image',
  };

  const optimizedImage = new OptimizedImage(
    'https://test.jpg',
    mockCacheService,
    mockOptimizeService
  );

  const result = await optimizedImage.get();

  expect(result).toEqual('optimized image');
  expect(mockCacheService.put).toHaveBeenCalledWith('optimized image');
});

这里没有什么突破性的东西——只是一个小功能,让我的生活更加符合人体工程学。希望以后能遇到更多这样的宝石。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

40

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

50

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

12

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

13

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号