V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  GeruzoniAnsasu  ›  全部回复第 46 页 / 共 147 页
回复总数  2927
1 ... 42  43  44  45  46  47  48  49  50  51 ... 147  
@XCFOX

我写过一丁点 unity ,unity 本身就非常 DI 。对于场景设计器之类的东西静态定义的对象,框架控制着对象容器,写的逻辑会被框架反向绑定到对象上,逻辑类( XXBehavior : Behavior )是通过 unity 提供的 API 来获取自己绑定的物体实例的,物体不持有逻辑逻辑也不持有物体
有啥好看的,拿锤看钉罢了

第一性原理: IOC 是什么,解决了什么问题

- 是什么: 当我在一个纯 OO 语言里,想用到某个 object 提供的方法时(比如 A 类的实例)需要 a=new A; a.method()
但我不希望当前写的这个逻辑依赖死 A 类,我希望有个「只要跟 A 类差不多的类实例」就行。于是可以使用接口+工厂,即 a=AFactory.New();a.method(),但这个实现依然要依赖特定的工厂,我希望写任何逻辑都能有一个万能工厂提供我要的接口,于是我不再在逻辑里写 a=new A 了,我写 a=THEGOD.provide("A"),或者在我的构造函数里写 CreateMe(I_WANT_AN_A a),这样我就有 a 了,怎么来的我不管,谁爱给谁给。

- 解决什么问题:
1. A 经常变化,我无法自己得到正确的 A ,但 GOD 可以,因为 A 会告诉 GOD 怎么生成自己
2. A 就算变了,我不需要配合改变,「代价」比较小




好,现在思考这两个问题在 golang 语境的意义

先说代价。因为这是最显著的差异
golang 是一个需要编译成二进制的静态类型语言,而且所有的代码都在同一个二进制里
它不像 java ,改了某一个模块,仅仅是那个模块的字节码发生变化。java 甚至可以动态加载字节码,也就说它完全可以 core 保持运行,临时下线一些功能,加载新的字节码,将原功能指到新加载的字节码上。
但 golang 不行。
****任意代码的修改都会导致整个程序重新编译****
编译时长之类的问题可以通过缓存文件优化,但是
****服务程序必须全部停止****
这一点是不会改变的。无论怎么折腾,golang 写的代码都必须重新编译,且**完全停止**原来的二进制程序运行再跑一个新的。
因此相比于 java 语境中「代价」有重大的运行时意义,golang 语境下「代价较小」的意义仅仅是保持代码工程的相对整洁罢了,但源码组织是整个软件工程中相当不重要的一环,我想没什么人会否认吧。大家都住在屎山,但没听说哪里的代码写成喜马拉雅能跑写成屎山就跑不了的。



再说问题 1

// service.go
var a IA = NewA()
a.method()

// interface.go
type IA interface{ method() }
func NewA() IA {
if 1{return a.NewA()}
if 2 {return a.v2.NewA()}
}

不行吗?
service 不引用 A 吧
interface 要改,但跟改 xml 本质上没什么区别吧



另外静态语言都不热衷这种框架,因为就算语言提供反射,它们也不像动态语言一样能「凭空造出一个类和实例」,从本质来说它们只能「改变指向类型的指针」,因此只要类型结构本身没有编译到二进制里,无论怎么折腾也造不出一个新类型。

这也就意味着 IOC 框架再怎么折腾也需要一个已经存在的类型实现,而非只要有存根就行。
因此在这些语言里,让框架为使用者寻找一个 IOC 容器的意义也仅仅只是在一个编译期就确定的类型映射表里找一个合适的类型罢了

那我代码里直接用这个静态映射不就好了,我干嘛还要「委托框架来帮我找」




----


拿你提的这个框架来说
1. 不使用这个框架,只用 interface 是不是也能从代码上解耦?
2. 使用这个框架,接口实现变化是不是一样的要「改代码+重新编译+重新部署」而且改动范围差不多?

golang 生态在微服务化跟 java 生态在 bean 化都是需求和语言特性 /限制的「磨合」,反向照猫画虎反正我的心态都是看个笑话
2022-06-24 12:02:30 +08:00
回复了 Yuan2One 创建的主题 C++ 想问下后台用 C++的话,怎么跟前台交互呢
假设 c++库 /程序叫 core:

- core 在内存中保存配置或者控制位
- core 如果需要被外部控制,可以序列化成比较通用的结构化数据比如 json/msgpack ,外部控制器(比如 golang 写的 web 后端)来负责持久化它们,存取数据库之类的,core 只解析 web 后端传过来的结构化数据
- 转发器直接将流量转到 core ,比如 nginx module 或者集成了 libpcap 的东西,它们可以直接通过 IPC 手段与 core 存取同一个共享 buffer
- core 执行必要的计算并且在内存中保存计算状态
- 等待 web 后端异步地来读取这个状态,或者 RPC 通知后端状态发生变化
- 在 RPC 里传递计算结果,这时候就还是通用结构化数据
2022-06-24 11:48:07 +08:00
回复了 Yuan2One 创建的主题 C++ 想问下后台用 C++的话,怎么跟前台交互呢
c++后台一般不直接跟 web 交互

可选的方式有:
1. 编译成动态库,暴露 C ABI 的 API ,这样 goalng 之类的后台基本可以即插即用(需要共享一个头文件和一个不需要实现具体功能,即 stub 的动态库二进制文件)
2. 使用 unix socket ,交互 json 数据或者 protobuf 之类的(无队列)
3. 使用消息队列中间件,随便选一个两边语言都有 binding 的
2022-06-23 23:04:04 +08:00
回复了 xingheng 创建的主题 职场话题 灵活就业的申请问题
北京灵活就业必须京籍。
2022-06-23 18:16:15 +08:00
回复了 particlec 创建的主题 问与答 想学粤语有什么好办法吗?
看来你在深圳。

我这有一个收藏了十几年的网站,虽然没什么用,但,它很特别:
http://humanum.arts.cuhk.edu.hk/Lexis/lexi-can/
2022-06-23 11:50:38 +08:00
回复了 James369 创建的主题 Linux 这个 Cpp 示例代码什么意思,没看懂
const char(&a)[N] 是一个 有 N 个元素的 char array 的引用
https://stackoverflow.com/questions/13081837/reference-to-an-array-in-c

并且 N 是一个模板参数,因此任意长的 string literal 都能匹配这个模板。N 是模板匹配的结果
2022-06-22 19:24:20 +08:00
回复了 windplume 创建的主题 问与答 关于 read、get 和 query 这三个动词如何使用
fetch remote status
get information & privacy
query by parameters
find pieces in un-indexed space
read while seeking
2022-06-22 19:20:09 +08:00
回复了 windplume 创建的主题 问与答 关于 read、get 和 query 这三个动词如何使用
@windplume
@doublleft

没啥好纠结的,最好的做法是第一个词不小心用了 get 就全 get ,第一个词写了 query 就全 query

read 这个词我只会在「有一个打开的文件+游标+一个 buffer 」的时候用
2022-06-22 18:54:12 +08:00
回复了 HansZimmer 创建的主题 5G 5G 出来这么多年,成功了么?
@marcong95
> 因为我看 B 站似乎不会断了


那是因为 B 站把所有视频码率缩减了,视频流变小了而已
2022-06-18 13:05:02 +08:00
回复了 xjp9832 创建的主题 Apple MacBook Air M2 决赛圈选择,是选内存还是硬盘
内存。
无论开发还是学习 虚拟机都是第一需求(因为还有 docker 存在),虚拟机+浏览器+IDE 会迅速耗完所有的内存空间,我现在 32G 的内存都不轻松,经常需要检查一下哪些窗口应该先关掉或者先把一些容器停掉。

18 年的时候配台式机感觉 32G 能虚荣一小会了,20 年的时候入手的 mbp 32G 就感觉已经是刚好够用了。 下回换掉我的台式机的时候应该会想办法搞到 128G 以上内存
2022-06-17 22:48:17 +08:00
回复了 dunhanson 创建的主题 程序员 RESTFul API 接口规范, GET 请求如何传递复杂对象?
你的接口是一个动作语义


你已经不 restful 了


趁早放弃残废的 restful 开始 post 一把梭还有救



你可以美其名曰 lite-json-rpc
2022-06-17 11:44:43 +08:00
回复了 WOLFRAZOR 创建的主题 随想 断,舍,离
大隐隐于市

我真想给你看看我的手机应用列表


1. 不算空屏看时间的首页,所有 app 两页塞不满
2. 装得最多的同类产品 top 排行 NO.1 是手机银行,第二是并列的 IM/应用市场 /租车软件 /浏览器(含自带)/滑雪 app
,他们的数量是每类两个。
3. 我的微信消息提醒下面是 ... 、(省略号)。粗略地划了一下列表有红点的有几十个「联系人」,但全都是不需要看的
4. 我的手机内置存储只有 128G ,目前剩余 29G ,占用空间里 71 G 是应用数据,其中的 40G 来自手机 QQ ,也就是每天收回来的各种色图表情包
5. 我支付宝和微信都装了的原因是上学的地方是马老师的地盘但家是马老师的地盘迫不得已。但直到毕业前我都没点过微信支付,第一次在微信上绑卡我甚至是忍着问我妈怎么操作的冲动的


我没有微博账号,这意思不是我注销了,而是我账号绑定的手机卡由于太久忘记续费已经在 7 年前被回收了,现在我的微博账号能登录但不能换绑,也没有任何关注,等于没用的空号

我没有装淘宝 /jd/pdd/美团 /大众点评 /饿了么,我也并不自己做饭,而是靠支付宝小程序

我一切资讯来源就是各种游戏 q 群。他们会转发真正紧急的新闻,并同时停止转发色图和沙雕 memes 。因此如果色图列表中没有新闻,那说明真的没有新闻。


每天早上手机都会新增几十条推送,但我从来都没看过他们是什么,就跟我的 gmail 收件箱一样。手机一天看两次,其中一次是点一键清除。既然如此塞了 999 消息又跟我有什么关系呢


用带有知乎式侮辱性色彩的话来说,OP 这叫「断舍离爱好者」
体会一下
1 ... 42  43  44  45  46  47  48  49  50  51 ... 147  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2302 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 41ms · UTC 13:11 · PVG 21:11 · LAX 06:11 · JFK 09:11
Developed with CodeLauncher
♥ Do have faith in what you're doing.