V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  GeruzoniAnsasu  ›  全部回复第 54 页 / 共 148 页
回复总数  2956
1 ... 50  51  52  53  54  55  56  57  58  59 ... 148  
2022-04-19 06:20:53 +08:00
回复了 angrylid 创建的主题 问与答 怎么才能找到适合自己学习的开源代码?
说实话我不太建议学习阶段用开源项目作为学习材料

一来很多开源项目架构真的太复杂没法入手
二是学习阶段并没有能力分辨库质量好坏

业务代码就更别看了,世界上没有几行业务代码是精炼过的

我编程学得很早,但也是工作后才逐渐看得进开源大项目的代码的。因为写业务代码会有人告诉你整个系统的架构包含哪些部分和抽象层次,我们现在正要写的东西在哪一层什么功能;你可以从两三个文件入手逐渐摸到整个系统的其它部分。

读代码有点像走迷宫,你得有一个起点然后摸着墙(沿着调用关系链)走,一个文件里包含的数十个函数像是迷宫里并排的几个通道,你看过去了好几个通道(函数),但很可能跟你要走的这条( API 的调用链)并没有什么关系,会晕是必然的。



个人经验是如果真要评估一个库或者开源项目,就从它的 quick start 或者 bootstrap 看起,观察都有哪些 essential 步骤,每个步骤的目的是什么,然后你自然会考虑每个步骤能不能实现我要的更多需求或目标,逐渐翻阅官方文档和实现,就能慢慢理清楚一部分了。

好的项目模块之间都是很松散的,你完全可以只理解你需要的一小部分然后马上开始针对这一部分做修改。

我只看了一周 vue 的文档也能重写一遍 element plus 的组件——前端组件的组织单位是很小的,一个组件只有几个文件,尽管整个库非常大,但理论上来说我都已经能贡献新组件的代码了,无非是照着原样把文件布置好而已,库的规模并不影响你 **先认知一小部分** 。我想学到一个预期功能需要哪些界面元素、绑定怎样的数据结构、暴露哪些部分,那我其实只需要找到一个组件来看对不对

我也看了很大一部分 gorm 的代码,gorm 充满了各种 interface{}接口和 function dispatch table ,要直接啃源码我敢说根本不可能有几个人能看下来。但如果你只跟着一个 Create 函数进去就会发现结构其实很清晰:一层链式 API 接口,里面一层通用数据结构处理过程(判断 session 、配置、寻找构建器、判断传入值类型等等),再里面一层 clause 构建器( create 的构建器),再里面是按数据库划分的「构建 driver 」,然后在比如 mysql 的「构建 driver 」里就能看到它怎么拼接 create 和值的字符串、它做了哪些判断和额外操作。这个过程如果我看到不科学的地方比如对关系字段的处理不够好,那我也能开始着手自己的修改。尽管我现在对 ALTER 都干了什么还一无所知,但我已经掌握这个库的一部分架构层次和设计概念了,无非是时间和取舍问题没有对库里所有的东西都摸全覆盖全而已

还有那种更大型的微服务项目,尽管整个项目的体量看起来非常吓人,但你可以先研究脚手架都能干什么、它生成了什么东西,然后搞明白一个 service 单位包含哪些东西。再去寻找猜测可能实现你想找的东西的 service ,逐渐拨开抽象层和数据结构,怎样都是能看进去一部分的
2022-04-18 22:04:02 +08:00
回复了 3dwelcome 创建的主题 算法 构建一个完美无冲突的 hashmap。
来,我特意在 CSDN 上找的:

https://i.imgur.com/zQbCavc.png
2022-04-18 10:41:20 +08:00
回复了 0o0O0o0O0o 创建的主题 问与答 一般来说杠字如何定义?
OP 觉得这个词被滥用让人不适,我有同感,但我的不适感来源于这个词的定义太过于模糊了

比如在我看来这楼里提到的大多数行为都不是「抬杠」

据我的定义,「抬杠」一定是与原断言的语义相关的,是针对原断言语义范畴大小的演绎。而诸如「扣帽子」「贴标签」这样的行为是不需要与断言语义有关的,仅需要语句中出现关键词素即可完成,跟杠是两码事了
2022-04-18 10:32:30 +08:00
回复了 0o0O0o0O0o 创建的主题 问与答 一般来说杠字如何定义?
我心目中的定义很明确:

抬杠=故意抬高原 assertion 的判定标准使得陈述不再成立的行为。

比如「大家其实都不喜欢抬杠」←这个断言里,「大家都」圈定的范围其实是比较模糊的,在允许语义相对模糊的情况下,我说「都」,可以约等于「在全体人群中均匀随机采样得到的样本空间内,大部分」。抬杠的做法即,由于「大家都」并没有明确指代哪个部分,我现在把精确度标准提高,那么「都」是一个全称量词,∀n(n∈自然人):¬(n 喜欢抬杠)存在反例: ∃n(n∈自然人):n 喜欢抬杠,原断言变得不再成立。

用人话来说就是
原断言:「大家其实都不喜欢抬杠」
抬杠:「怎么能说都,就是有人喜欢抬杠」



因此 「杠」字就是那个「标准」
日常交流其实大部分的「标准」都是隐含的,比如当前这句话的「大部分」就没有指出具体是哪些部分。
当语境不需要显式指出所有标准细节,而又存在一个拎出某个细节试图使断言失效的行为,那么这个行为就是「杠」
我来翻译:

「我会一点 x86 汇编,但是不会调试 vm 语言的字节码,是不是不需要会?」
2022-04-17 20:15:51 +08:00
回复了 cpf 创建的主题 信息安全 寻求 U 盘或系统盘文件夹加密 解决方案
其实系统自带全盘加密是最好的……
灵活性问题建议分多一个区解决
/t/834415
/t/837270

----

大部分人都会看完内容,但他们仅仅想对内容的一小部分发表看法而已

建议下次 h1 加粗写「仅限对本句观点发表评论」

----

没有 ios 设备,现在 ios 不能用字符组合的复杂密码了?
2022-04-16 21:49:46 +08:00
回复了 justou 创建的主题 C++ 请教一个 C++模板问题 (≥C++17)
@lujunliang 模板只有在用到的时候才会实例化,实例化前被剔除掉的话根本不会进入语法检查阶段。 trait 类的所有成员最终只会留下 BaseType**推导结果** 的定义。在这个类里写一个 int a(){return "X";} 编译器都是不管的。所以只把声明留下来不要函数体也可以,反正最后编译器不会去检查这个函数的定义在哪里,只是用声明计算类型而已。
2022-04-16 12:23:33 +08:00
回复了 justou 创建的主题 C++ 请教一个 C++模板问题 (≥C++17)
https://godbolt.org/z/vq6hM4534

定义一个 trait 类,其中有一个类型成员 BaseType:
当 T::Base 存在时 using BaseType= T::base
当 T 继承自 SomeBase 时 using BaseType=SomeBase

另外介绍一下这个站:
https://cpppatterns.com/patterns/function-template-sfinae.html
https://cpppatterns.com/patterns/class-template-sfinae.html


我几乎每回重新写 trait 都要来查一下。。
2022-04-16 11:25:41 +08:00
回复了 znwindy 创建的主题 深圳 求推荐深圳租车平台
只用神州和 e 嗨,除了贵点啥毛病都没有。

两家都能手机自助开锁取还,e 嗨还有 etc ,app 里还车结算。
2022-04-15 23:57:33 +08:00
回复了 FreshOldMan 创建的主题 问与答 有没有和我一样的,都已经很久不主动记 API 了
我刚开始学写代码的时候能记住 10 多个 C 库函数和几十个 Windows API/MFC 类成员函数,参数不说记得很熟吧,有几个大概是些什么还是比较清楚的

后来呢,接触了 c++ stl / java ( android )/ kotlin / python / golang / haskell ,写了单片机的工程、嵌入式的 linux kernel 和 bootloader 、golang 的 crud 、vue 的 速成页面、unity 的小玩具 …………


别说什么 API 了,sql 语句我都得翻个文档出来参考。
更搞笑的是, 我觉得 dash 还是比较好用的,但后来 dash 也用得越来越少了,还是直接浏览器 google 文档,因为连 dash 搜索我要打什么前缀都要搞不清了:

https://i.imgur.com/7CpSZnH.png
先建倒排索引呗还能咋的,反正只遍历一次

反正架构方案就要求了前端必须完整存储所有 data ,那我为了加速多建几种用于索引的数据结构谁都 blame 不了吧
2022-04-14 23:00:42 +08:00
回复了 chenliangngng 创建的主题 前端开发 请教大佬,把一段代码用函数式编程变得更加优雅
函数式的精髓在于「符号演算」,本质上是一些公式代换,所以是在处理复杂对象关系和约束时才比较好用,并不是说函数式就比过程式更优雅,先走出误区。

再说实例。
你展示的一个 getdetail 的过程:
1. 调接口
2. 验证拉取结果
3. 对参数进行「变换」
这个描述本身就非常过程化,有明确的分段步骤,并不存在关系约束的语义,所以用函数式写本来也不适合。

当然也不是不可以,我们换个描述:

1. setdetail 接受「 raw 数据的变换结果」,最终将结果闭包展开,暂时先不管它内部什么样
2. 「 raw 变换结果」可以写为将「变换」应用到「 raw 」上 ← 函数化
3. 「 raw 数据」可以看做将「请求提取子(包含验证子)」应用在「数据源」上←函数化
4. 「数据源」是一个「输入请求类型然后重封装为响应类型的 monad 」←函数化
5. 「请求类型」 由 「请求类型变换子」应用在「请求数据」上得到←函数化


你觉得这优雅吗,我觉得一点也不,还非常麻烦和抽象,每一个「变换子」(即函数)都得绞尽脑汁才写出来,这些步骤也不可能比过程描述要少。


像 map 和 filter 这样的函数已经是函数式最适用的最小场合了,提供一个输入数组和输出数组的约束函数,把这个约束应用在原数组上得到新数组。这不函数化吗,不够优雅吗?
2022-04-14 04:43:24 +08:00
回复了 Features 创建的主题 程序员 发现 photoshop 做九图好简单啊
以防后面的人一脸懵逼点进来又一脸懵逼点出去,放个搜索结果:
https://www.jianshu.com/p/122240596c99
2022-04-14 04:41:04 +08:00
回复了 Features 创建的主题 程序员 发现 photoshop 做九图好简单啊
woc 长见识了,今天才知道还有这种东西

称得上设计 hacking 了
@devswork

当你 **产品的用户告诉你** 他们有两三个服务中心要冗余备份但统筹管理,你的产品满足不了需求的时候。

而不是「为了方便将来能卖给」 有这种规模的用户而提前用上这样的架构



toC 的话,约等于,「用户没在微博上发网站怎么挂了」,就别用,用不上。
2022-04-12 18:03:19 +08:00
回复了 haoooooooo 创建的主题 职场话题 现在还能让第三方代缴社保不?
@PerFectTime 你好,个体户要房产证
2022-04-11 23:13:03 +08:00
回复了 yunshangdetianya 创建的主题 Go 编程语言 请教各位 go 语言大佬一个问题
@yunshangdetianya

> 接口作用就是限制和约束类型

正相反。

静态类型语言的变量,类型是「唯一的」。你可能一下 get 不到有多唯一,我举个自己初学 oop 时对我帮助很大的例子

- 你的程序有两个窗口
- 窗口 A 叫 A ,B 叫<嘎>
- 你给窗口 A 声明了一个类型 type WindowA struct{ Title: A }
- 窗口 B 的类型 type WindowB struct{ Title: <嘎> }

现在你想判断鼠标点击了哪个窗口:

func findWhichClicked(x,y int) (T){}

问题来了: 应该返回什么类型?返回 A ,那么点到 B 这个函数就给不出数据了,反之亦然。
那……返回他们的公共类型?

type WindowA{Window; Title }
type WindowB{Window; Title }// AB 都来自 Window
func findWhich(x,y int) (w Window){}

但还是有问题: 我想获得点到的窗口的标题:

w := findWhich()
w.Title() // ?

做不到!
我永远只能获得 Window 的标题, 不能获得 WindowA 或者 WindowB 的标题。

「这事简直跟我是男人了就不是人了一样荒唐」!!


你可能会疑惑了,那用个公共变量呗

if inA() {w=windowA}
else if inB(){w=windowB} // 类型不匹配!,无法将 WindowA 类型的变量赋值给 Window 类型




------


接口:
type <有 title> interface {Title() }
func findWhichClicked(x,y int) <有 title> {} // windowA 和 windowB 都可以实现 <有 title>
w.Title() // w 可以是任何 <有 title>类型,运行期决定

如果 w 是 windowA ,那么调用 windowA 的实现,是 B 调用 B 的实现。





------


想想这句话: 「我要使用一个变量,它可能代表不同的东西,但类型又得是唯一的」
1 ... 50  51  52  53  54  55  56  57  58  59 ... 148  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5844 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 61ms · UTC 01:48 · PVG 09:48 · LAX 17:48 · JFK 20:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.