playground-sessions / php-code-exercise
API 编码练习。
v1.0.2
2021-02-12 22:41 UTC
Requires
- php: ^8.0
- laravel/lumen-framework: ^8.0
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.9
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.3.1
- phpunit/phpunit: ^9.3
README
场景
考虑以下假设情况。
我们正在为教师开发一个iOS和Android应用程序。教师可以选择一个学生,查看所有课程,并查看该学生是否完成了每门课程。
每个应用程序将从一个JSON REST API端点获取其数据。
/student-progress/{userId}
其中 {userId}
是学生的用户ID。
你继承了此代码库。
你记得数据是如何结构的。
- 课程包含多个段落。
- 用户可以为段落创建练习记录。
你检查了代码库,并发现此端点存在几个问题。
- 业务规则(例如,用户是否完成了课程)将被每个应用程序重复。
- 即使是有合理数量的练习记录,它也过于缓慢。
幸运的是,两位前端开发人员都同意在投入使用之前需要更改端点。你们都同意以下响应数据结构。
{
"lessons": [
{
"id": 32,
"difficulty": "Rookie",
"isComplete": true
}
]
}
说明
使用此代码库解决所有问题。
- 创建新的响应数据结构。
- 将以下业务规则编码化。
- 如果每个段落至少有一个得分80%或以上的练习记录,则课程完成。
- 难度类别(“新手”、“中级”、“高级”)分别与难度数字[1,2,3]、[4,5,6]、[7,8,9]关联。
- 确保用户ID 1的响应时间在500ms以下,对于给定的数据集。现在响应时间约为2秒。
根据单一职责原则(SRP),代码应干净地编写成独立的部分,每个部分都只有一个职责。例如,应用程序逻辑(例如,从URL中提取查询参数)应与业务逻辑(例如,确定课程是否完成)分开。
你可以完全控制代码库。你可以添加或删除你喜欢的任何包。一切皆有可能。
我们正在测试你组织代码的能力,以及SRP,而不是你关于Laravel/Lumen框架的知识。
尽量频繁提交,并且更改小,这样我们可以看到你在做什么。
如果你有特定的优势(比如API文档),请尽情展示。
你可能知道,所有三个问题都可以在不使用缓存的情况下解决。
交付物
通过电子邮件 ben@playgroundsessions.com 发送链接到你的git仓库。
入门
使用PHP内置的Web服务器,入门非常简单。
- 安装PHP 8.0。
- 遵循开发环境设置
开始吧!
我们期待看到你的代码!