本周工作日的某一天,
翻开一篇博客园文章:“……这样写更优雅……”、
打开一篇 Laravel 某个特性的介绍:“……这个框架……以优雅著称……”。
优雅到底是什么?小布尔乔亚?是我漏了什么吗?
去逛 Stackoverflow 、去大佬们的独立博客、去 Github 讨论问题,大家都直接讲“稳定”、“安全”、“性能”、“可读性”、“模块化”……
我记得,Yii2 那时的 Slogan 是 “安全、稳定、高效”,现在竟然给我一种“都在吹优雅”的感觉。
( Ps:上一次给我留下印象的“优雅”,还是小红书里的名媛)
1
momocraft 2022-07-10 22:09:17 +08:00
优雅是更优雅的好
如果没有更具体的东西可夸 不管是认识不足还是表达不足 就可以说 "优雅" |
2
Leviathann 2022-07-10 22:09:39 +08:00 14
真的逛过 github 吗,elegant 不是很常用的词?
|
3
hello2090 2022-07-10 22:13:58 +08:00
“安全、稳定、高效” 一听就不优雅!
|
4
uiosun OP |
6
liaohongxing 2022-07-10 22:24:30 +08:00 1
php 就是不用框架也能撸,效率还不差 。但是撸出来的代码就自己能看懂 ,没得大型工程的样子 。
如 Laravel DB 模块的什么获取器 修改器什么什么的 改个功能很规范 ,再加上 api 命名就很容易理解,专业的样子。 就形成了优雅,主要对比原生撸 |
8
uiosun OP |
9
twing37 2022-07-10 23:07:52 +08:00
我理解的是最大限度的帮助用户专注业务逻辑 /目标事.
|
10
ywisax 2022-07-10 23:09:45 +08:00 3
主要是没啥可吹了。
说 stable 嘛,symfony 必然是第一; 说 fast 嘛,slim/yii 一批框架在前面; 说 simple 嘛,其实国产 thinkphp 真的挺 simple 的,国外的 ci 也足够 simple ; 说 security 嘛,其实大部分现代 php 框架都比较安全; 为减少对标竞品,自己新开一个“优雅”赛道这样就没人打得过。。。 |
11
twing37 2022-07-10 23:09:54 +08:00
"这样写更优雅" 我理解就是写的字少.
|
12
caqiko 2022-07-10 23:15:55 +08:00 via Android
我觉得可以理解为 best practice
|
13
kingjpa 2022-07-10 23:21:07 +08:00
虽然我很不喜欢 Laravel ,但除去性能不谈,不得不承认它是很不错的。
|
14
dzdh 2022-07-10 23:21:49 +08:00
喜欢更 [方便、简单看起来高级] 的实现某些功能吧。
比如 go 的标准库封装的就很 [优雅] 比如 php 的 autoload 的 [机制] 看来比每次都 require common.php [优雅] |
15
darklights 2022-07-10 23:34:14 +08:00
|
16
james122333 2022-07-10 23:39:29 +08:00 via Android
因为他们对优雅这个字有误解
|
17
pengtdyd 2022-07-10 23:40:24 +08:00 2
请描述一下什么是《美》
|
18
james122333 2022-07-10 23:40:50 +08:00 via Android
易学易修改简单化才是
开个坦克 |
19
james122333 2022-07-10 23:43:43 +08:00 via Android
开个坦克一点都不从容哪能叫优雅
顶多你花时间深入熟悉以后稍微有举重若轻的感觉 不过也就一点点 |
20
haoliang 2022-07-11 00:11:19 +08:00
还有个烂大街且含义不明的形容词 “modern”
|
21
lithiumii 2022-07-11 00:15:39 +08:00 via Android 1
可能是语言的问题,假如是 Python ,大家就把这种无以名状的好称为 Pythonic
|
22
haoliang 2022-07-11 00:25:54 +08:00
不吧,pythonic 类似于 idomatic ; python 这边对标的有 for humans™
|
23
LeeReamond 2022-07-11 01:16:41 +08:00
@lithiumii 感觉上 python 式一般强调的是表述上的短,或者表述上接近自然语言,通常来说达到这个标准了也就优雅了,但是也存在过分追求精简而导致可读性变差的情况,导致不优雅,所以优雅与 pythonic 应该不是同等含义
|
24
jay4497 2022-07-11 09:03:54 +08:00
就是 好 的代用词吧,就好比我只会说牛逼,词汇多的人就会用更好听的词,不至于这么较真的吧。。。
|
25
panlatent 2022-07-11 09:07:38 +08:00
说优雅倒也没啥毛病,在 Laravel 刚到来 /火起来的那阵,它开发体验对比其他 PHP 框架确实有明显的改善。
现在优雅、现代、XXX 哲学,这些词都被用烂了。但 “现代” PHP 就是比曾经的 PHP 更规范、更工程化,更注重开发体验。 |
26
james122333 2022-07-11 09:29:51 +08:00
|
27
panlatent 2022-07-11 09:34:41 +08:00
@james122333 那可能对开发体验的判定标准不一样
|
28
chouqiu 2022-07-11 10:33:49 +08:00
应该就是:可读性、模块化、易维护
|
29
iamzuoxinyu 2022-07-11 11:09:47 +08:00
Laravel 设计灵感是源于 Ruby on Rails 的,放在它出生的时代,不论是『约定大于配置』的思想,还是 API 设计、命名上,确实是摆脱了 PHP 很多糟糕的东西,另外对 Composer 的生态也有挺大的推动。说优雅也不算过分,只是代价就是出错就是 20+层的调用栈。
另外一个逸闻:可以看 Laravel 源码的注释,这个作者有强迫症,一定会把注释结尾写成阶梯递减的形状… 但不管怎样也改变不了 PHP 的设计是坨屎的本质。Laravel 所作的一切都只是让这坨闻起来不那么臭。 |
30
seth19960929 2022-07-11 11:17:43 +08:00
优雅具体意思:(指物)优美雅致
用了三年+ Laravel, 我觉得主要体现在这几点(哈姆雷特理解法) 1. 工程化的目录设计(君不知以前 PHP 有多随意, 其它语言也是, 除了恶霸 Java) 2. 代码, 语义 API 设计, PHP 原生有很多函数为了向下兼容, 导致难以理解, 特别是参数位置等等 3. 开发体验, 你写代码的时候用起来像是一位作家(优化的作家) 4. 文档 (用过很多 Golang 的框架, 在文档这一方面, 真的是用起来让人头疼, 只管代码进步, 不管文档的进步) |
31
seth19960929 2022-07-11 11:19:48 +08:00
@iamzuoxinyu 哈哈哈, 这个阶梯注释.
public function registerFactory() { $this->app->singleton('view', function ($app) { // Next we need to grab the engine resolver instance that will be used by the // environment. The resolver will be used by an environment to get each of // the various engine implementations such as plain PHP or Blade engine. $resolver = $app['view.engine.resolver']; $finder = $app['view.finder']; $factory = $this->createFactory($resolver, $finder, $app['events']); // We will also set the container instance on this view environment since the // view composers may be classes registered in the container, which allows // for great testable, flexible composers for the application developer. $factory->setContainer($app); $factory->share('app', $app); return $factory; }); } |
32
seth19960929 2022-07-11 11:20:06 +08:00
一个方法两个阶梯
|
33
maddot 2022-07-11 11:34:51 +08:00
为了吐槽而吐槽
|
34
THESDZ 2022-07-11 11:41:07 +08:00
个人理解的优雅就是, 简洁高效,且可读性强。
|
35
THESDZ 2022-07-11 11:45:37 +08:00
@THESDZ # 34 大概翻译一下,就是
1.代码整洁,没有多余的部分,例如 userService.get(id)而不是 userService.getByID(); userService.findByName(name) 而不是 userService.findByUserName(username) 2.小而美,比如 findByName 和 findByCode 不会耦合成一个 3.设计不会反人类(即,一眼看上去就知道写的啥,符合业界主流的标准,比如 GET xxx/{id} DELETE xxx/{id}) 以上纯属个人理解。 |
36
wonderfulcxm 2022-07-11 11:45:59 +08:00 via iPhone
都是噱头,就像吹 go 言必心智负担低,听得都麻木了…
|
37
james122333 2022-07-11 12:01:17 +08:00
@panlatent
你有编程思想加上 php 的易用写的就很畅快了 laravel 说实话那一堆东西你自己实现都可以更简单效能更高 至于楼上一堆说有多优雅(听起来是认为有规范就是优雅 然而哪个框架没规范...) 文档多好(你写 php 只要有 php 官方文档就可以写了 发行版甚至有打包 想实现什么就实现什么) 就... |
38
tabris17 2022-07-11 12:02:35 +08:00
优雅就是可以少写代码
|
39
jaggle 2022-07-11 12:26:06 +08:00
|
40
seth19960929 2022-07-11 12:36:47 +08:00
@james122333
1. 有规范也不一样. 我自己写的框架, 规范能和一个社区或者成熟的比吗. 2. PHP 那个叫做函数 API, 别人的是使用手册(所以对应的应该是 PHP 入门教学等等之类的) 3. 自己实现更加简单的? 这个真的无话可说. 别人那个代码都是白写的了. |
41
Laussan 2022-07-11 13:03:18 +08:00
高斯绝妙定理对高斯曲率是内禀性质的证明可称优雅。
|
42
iosyyy 2022-07-11 13:13:03 +08:00
@wonderfulcxm 我前几天还看到有拿 go 和 java 比的也不知道哪来的自信..天天吹那低心智满屏幕的 err 不知道哪低心智了
|
43
panlatent 2022-07-11 13:55:41 +08:00 via iPhone
@uiosun laravel 称得上是优雅,我是 yii 用户 但我觉得更能代表 yii 的词是:实用
|
44
mhqschen 2022-07-11 14:01:58 +08:00
我一直以为优雅这个词是《间谍过家家》带火的~
|
45
fuchish112 2022-07-11 14:25:10 +08:00
在命名规范,语义化方面确实比其他 php 框架要好一些
|
46
lovepplforever 2022-07-11 14:33:16 +08:00
laravel 抄袭 rails 的
|
47
blless 2022-07-11 14:42:36 +08:00
@iosyyy #42 现在满屏还在说 Go 的 err 是我最不能理解的事,有异常本来就是司空见惯的事情,你不处理不代表异常就消失了,处理少了,只能说你的错误在哪个不知道的环节被吞了而已。
我现在看见 Java 代码的 try catch 就害怕,有些甚至都不是新人,遇见异常就无脑 catch ,函数签名基本看不见几个 throw 的。 |
48
blless 2022-07-11 14:46:08 +08:00
要我说 Go 优雅,肯定是 defer 跟协程了。defer 现在不知道有啥语言支持,反正 Go 里面是真的优雅跟省心。协程就不用说了,事实证明这一套 go select channel 设计,我反正还没看见别的语言能说超过 Go 的。
|
49
iosyyy 2022-07-11 15:09:56 +08:00
@blless 有异常并且把异常消除才是最好的办法一般情况下 java 的异常都统一处理了 而 go 的异常直接放在返回值里面才是最蠢的 我返回一个 err 下面所有的函数都需要对不同的 err 都接收 而 java 我直接 catch 或者直接抛出去统一处理就行了 而你说的 defer 实际上写起来也相当的乱 一旦我 defer 调用的方法返回有 err 那处理起来是相当的费劲
|
50
blless 2022-07-11 15:25:01 +08:00
@iosyyy #49 “有异常并且把异常消除才是最好的办法”,虽然很多观点是自由心证自说自话,但这句真的没法苟同的。“Let it crash”也算 Go 设计哲学之一,一开始也不算认同。Bug 处理多了,血泪教训之下对 Go 某些设计还是觉得入木三分。从这点出发,Java 如果要认真处理每个异常错误的话,也得一个一个函数 throw 而且加上签名,真的比满屏 err 好不到哪。 不过 Java 语法糖多,用修饰处理异常啥的方法手段确实比较多且节省时间。其他就不多说了,语言流行自有他的道理,讨论多了也累。
|
51
1988chg 2022-07-11 15:29:00 +08:00
起码是相对规范吧。
|
52
string2020 2022-07-11 15:34:30 +08:00
如果一个普通人看到一个东西觉得舒服,觉得可以学习,觉得得体,那这个东西就是就是优雅的
|
53
Felldeadbird 2022-07-11 16:07:30 +08:00
个人认为:某版本引入了 强大又实用的语法糖。 语法糖一看就是一种糟粕,书本上说语法糖要慎用。 经过转译: 新版引入优雅的编码方式。
|
54
bestwaytowait 2022-07-11 19:57:33 +08:00
现在 modern 都快不够用了,现在要 post-modern 。马上就不知道该用什么词了
|
55
liuxu 2022-07-11 20:33:24 +08:00 1
既然都是 phper ,就以你过去曾经提过的 2 个技术问题来回答
第一个:如何生成“连贯的数据”用于自动化测试? https://v2ex.com/t/814879 解决你这个问题,在 laravel 中只需要定义相关 model 和 factory 即可,https://laravel.com/docs/9.x/database-testing 而语法定义非常简单直观: class BuildingFactory extends Factory { public function definition() { return [ 'user_id' => User::factory(), 'city_id' => City::factory(), 'type' => $this->faker->randomDigit(), ]; } } 以上建筑 factory 定义了与 user 和 city 的关系,创建建筑会自动创建对应的 user 和 city ,也可以用其他链式语法反着创建 第二个:怎么让一个任务在发起后的第 6 个小时,自动执行? https://v2ex.com/t/787949 这个问题你可以使用 laravel 的调度器,去处理当前超过 6 小时的任务表即可,https://laravel.com/docs/9.x/scheduling $schedule->job(new BuildingSomting)->everyMinutes(); 更常用的,你可以使用队列,通知和任务模块处理此事: https://laravel.com/docs/9.x/queues ProcessPodcast::dispatch($buildingPodcast)->delay(now()->addHours(6)); 回到你的问题,什么是优雅"elegant syntax",就是用非常直观易懂的语法来实现工程任务,laravel 是个工具完备的 web 框架,不需要为了技术方案发帖询问 楼上有人说,书本上说语法糖要慎用,这里我同样引用书上说的:尽信书不如无书,近十年各类编程语言的发展,大量语法糖的加入,就是为了让代码更加通俗易懂 |
56
james122333 2022-07-11 20:45:37 +08:00 via Android
@
感谢 Reply 40 seth19960929 |
57
james122333 2022-07-11 20:56:40 +08:00 via Android
@seth19960929
基本上一堆既有框架使用派都跟你一样想法 认为自己写的不成熟 然而你并不需要该框架全部功能(含哲学性功能) 一些功能也有其它实现方式 php 原生就含有丰富的功能 我只是在表明你跟据原生手册实现一个体系一个框架并不难 laravel 效能差有目共睹 很多人讲的优雅其实封装一下完全不会差过它 并不是很凸出的特点 |
58
panlatent 2022-07-12 01:33:31 +08:00 via iPhone 1
@james122333
造框架一事上,并非如此你说的这样“简单”。先不说成不成熟,有没有人用这些问题,甚至不考虑从头造,就单纯用现有成熟度高的库作整合,拼一个框架,编码和思考的工作量并不低。 设计模式、编程思想、工程实践,算法 结合上语言的特点,这些落地并且弄的圆润舒适我觉得是相当难的。 虽然说有个玩笑话说没自己写过一个框架都不好意思学过 PHP ,但这玩意真是自己写着玩没问题,自己用没问题,甚至按公司业务造一个也没问题。 但要是真弄个通用的框架,难。总不能为了框架而框架吧,大多数人也没那个精力,写出来不能解决一定问题,还不如把时间拿来赚钱陪陪家人 |
59
haoliang 2022-07-12 02:45:03 +08:00
哈哈,都没人在意我这个拼写错误: idiomatic
|
60
kaiger 2022-07-12 09:33:17 +08:00
优雅?
大概是我一只手端着咖啡小抿一口,一只手在键盘上像弹钢琴一般地有节奏地敲着我的 24k 纯金键盘,在电脑屏幕上输出 "hello world" ,然后感叹一声,“真累。” |
61
james122333 2022-07-12 09:39:34 +08:00
@panlatent
很简单 重点在于你了不了解这技术背后的原理 思路清晰的状态下写一个非常快 也不用什么现有的库 因为 php 本身就有 不用 cgi 可以 自写一个实现可以(如楼上说的 scheduler) 很多需要的东西 php 早就提供了 心理有谱就行 设计模式就不用说了 这是类似围棋定石的东西 只是前人根据一些经验总结一些应用范例 不少人会定石也是一蹋糊涂 编程思想是根据框架不同而异 你有条理有规范生出来一个就差不多会有的东西 工程实践那细节了 算法本身与框架关联不大 而且你看了下 laravel 它像是有算法关联嘛... 想太复杂无中心创意思想肯定觉得难 这是大而全思想导致 基本上多数公司用的技能大同小异你简单写一个套用在其他公司基本上是没问题的(尤其对 web 来讲) 如果有额外需求那只是额外实现而已 如果你框架本身就考虑到扩充 那肯定是没问题的 做了好几次完全可行 甚至一些框架没有的功能都可以 你用现有框架思路会解决方案非常局限 甚至解法都烂大街了 看久就会知 至于自写框架当然是为了往后节省时间 因为你想要根据特殊需求解决并且迎合该框架使用逻辑是非常需要思考的 乱解就会与现有屎山一样 |
62
seth19960929 2022-07-12 10:29:39 +08:00
我见过不用框架派怎么实现以下功能的:
1. Scheduler Linux 机器上的 crontab 几十行脚本任务, 写代码的人和运维都懵逼(框架提供统一代码管理定时任务) 2. ORM && 模型关联 Laravel 的 model 我就不多说了, 作者都说过这个 Eloquent 是他最花费时间的地方, 说实话就 PHP 自带的 PDO 就玩玩可以, 毕竟还不够抽象. 模型关联难不难反正我用了好几个 Go 框架, 基本对于这个部分做的不怎么好(非 ORM 框架) 3. Queue && 延时 死循环 Redis (虽然 Laravel 也是这么做的, 但是你自己实现要做到可靠性保证), 高级一点知道用消息队列 4. Cache && Session 这一层相对于比较简单, 当时你要实现多个驱动的, File, Redis, DB 现在的人觉得 Redis 真的很简单, 但是对于一个刚学编程的人, 没有什么比不用任何配置就能用 file 做缓存更实际的了 5. View 对于实现继承视图, 重写视图等等我觉得还是挺好用的功能(自己写内嵌 PHP 到 HTML 就知道多痛苦) Go 刚出来那会也说什么大道至简之类的话, 不用框架. 后面为了占领 WEB 领域还不是老老实实得有框架, 就原生的那个能做什么. 即使是像 Gin 这种微框架(何况不用框架), 只适合大公司二开, 完全不适合企业级项目开发. 要什么数据库查询自己找库, 要日志自己找, 要个缓存中间件还要自己找, 更何况定时任务, 队列这些一大堆 |
64
james122333 2022-07-12 12:07:06 +08:00
@seth19960929
1. 你只要知道 cron 的格式含意你就能做出一个一模一样的东西 2. pdo 已经很方便 我也偏爱 想要物件关联 熟悉反射就可以 field 是 public 也可以不用反射 3. 语言程度可以写个 queue 也不难 4. 这个不讲了 5. php 还有 heredocument 可以不用写内嵌 整一整就很好用 go 的话同上 自己写也不错 |
65
seth19960929 2022-07-12 12:34:03 +08:00
不敢多说, 什么都能做出来.
花一个月, 还是一年? 一个月做出来然后用的时候很难用折磨自己吗. 之后接手的人用框架有文档可以看这个方法干什么. 然后用你是只能去摸着石头过河. 我读过计算机组成原理, 那去设计个个芯片. 我也曾熟读世界首富的赚钱理念, 成为下一个首富应该也不难. 我这就去赚钱, 不打扰各位了. |
66
james122333 2022-07-12 12:55:03 +08:00 via Android
@seth19960929
技术上不难 基本的一两个礼拜就好了 没人喜欢拿石头砸自己的脚 自己写的不能有文档? 而且你先要求你框架外业务有文档再説 况且单步傻瓜除错没人不会 这是两回事 写框架本来就是力所能及的 不是説首富不是想当就当 这论坛真的一堆奇葩类比 |
67
yxx1993 2022-07-12 13:55:46 +08:00
@james122333 "Talk is cheap. Show me the code"
|
68
lscexpress 2022-07-12 14:23:32 +08:00
吐槽:到底什么是“安全”? PHP 的新名词真是含义莫名……
( Ps:上一次给我留下印象的“安全”,还是安培保镖里的女网红) |
69
james122333 2022-07-12 15:32:39 +08:00 via Android
|
70
seth19960929 2022-07-12 15:41:24 +08:00
@yxx1993 老哥说得对
@james122333 一两个礼拜你要是能实现这个好用的, 真当人家几百个人开源贡献代码就不如你. v2 的人真的什么不知天高地厚的人都有. 你说你超越作者我都信. 毕竟 v2 大神也有, 但是一说一周超越几百个人花几年做的东西. @lscexpress 相对于原生 PHP 容易 SQL 注入, csrf, xss 攻击, 而框架有这个支持 |
71
james122333 2022-07-12 16:04:15 +08:00 via Android
|
72
james122333 2022-07-12 16:17:57 +08:00 via Android
@seth19960929
我说的是基本的东西 剩下的多花时间都可以完成 效能好好维护 毕竟也不能讲的太死 保守估计 这些框架本来就一堆喷点了 别人也不是做佛心的 肯定不会做的完美 一群人开发跟一个人开发本来就不是一样的 来回沟通要时间 也不是一直都有空閑时间处理 然后可能后面还有人下指导棋 甚至商业考量 blahblahblah 写的好过这些东西不难 大家都往完美迈进那就是内卷 |
73
seth19960929 2022-07-12 16:20:19 +08:00
@james122333 得, 既然你这样认为, 我无话可说.
|
74
magicdawn 2022-07-12 18:09:38 +08:00
优雅就是站着把钱挣了.
|
75
lanlanye 2022-07-12 22:11:33 +08:00
这个形容确实很抽象,一般代表最佳实践 /好的封装 /可读性极高的代码 /或者其他什么东西,比如我就觉得下面这行代码可以用优雅来形容:
3.days.after { do_task } |