V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  greenlaw110  ›  全部回复第 1 页 / 共 1 页
回复总数  17
2022-10-21 04:21:07 +08:00
回复了 likre 创建的主题 程序员 想问一下大家最爱用的操作系统和最爱用的应用程序是啥
操作系统: Mint + Cinamon - 偏保守者
浏览器: Chromium - 偏小白
应用:微信 - 绝对小白
2022-10-20 17:53:43 +08:00
回复了 longmeier90 创建的主题 程序员 35 岁的程序猿,有没有出路?
50 岁还在搬砖的老码农给个建议,与其焦虑,不如奋斗。一直记得卡马克说的那句,信息年代,障碍是不存在的,把快餐塞进冰箱,搞个电脑,撸起袖子开干就是了
2022-10-20 17:38:56 +08:00
回复了 tool2d 创建的主题 程序员 你们是什么时候感受到编程快乐的?
50 岁的老码农感觉一直都快乐!

- 刚进大学,进入要脱鞋的机房,跟着老师在西门子 7570 的终端上敲指令的时候,快乐!
- 学习 DBase 依样画葫芦写出小程序打印日历出来的时候,快乐!
- 学习 BASIC 仿照老师的代码,自己从头到尾敲出一份在 DOS 上用 ASCII 码画电力工程图的程序的时候,快乐!
- 自己研究 QBasic 贪吃蛇游戏,魔改进入任意关卡的时候,满足又快乐!
- 在三线城市小银行做电脑管理员,帮会计在 DOS 上弄一个 Config + AutoExec.bat 菜单,让她们能快速进入需要的程序,嗯,快乐!
- 后来玩 Java ,Perl ,c ,Python 各种语言,各自带来不一样的感觉,都很快乐!
- VS ,JBuilder ,JDeveloper ,Eclipse ,IDEA ,IDE 们玩起来真快乐!
- VIM 玩熟练的时候很快乐,Emacs 真烦!
- 字体换来换去好快乐!

你问我为啥搞软件就快乐,我想了几十年才明白,这是快反馈啊,跟玩游戏似的,操作能带来即时反馈,不就很爽吗?

能通过写代码这样快乐的工作来赚养家糊口的钱,真好!
2019-12-11 16:26:52 +08:00
回复了 shazh520 创建的主题 Java 大家在做单元测试的时候如何准备数据库环境?
mock 是常见的方式, 不过涉及到数据库操作的情况下,mock 总感觉不靠谱. 啥都 mock 了,函数里面也没有什么逻辑, 测试也失去了应有的作用.

这也是我一直很纠结单元测试的原因之一.

后来自己折腾出了一套 functional 测试工具, 数据准备与清理工作也不成问题了. 有兴趣的同学可以参考一下这里:
https://gitee.com/actframework/act-doc/blob/master/cn/test.md#-82-%E5%87%86%E5%A4%87%E6%B8%85%E7%90%86%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE
2019-12-06 09:11:52 +08:00
回复了 jaylee4869 创建的主题 Java boss 说了一个骚操作。。。
@Evrins Playframework1 哪里是这样, route 配置在后端, 前端不可能传递后端的实现细节的, 这种不是骚操作, 这种是瞎操作
2019-12-03 02:55:10 +08:00
回复了 imn1 创建的主题 反馈 请不要在每一个回复中都包括外链,这看起来像是在 spamming
@imn1 实在不好意思, 我当时有好几个 V2EX 的 tab, 一不小心就贴错了. 但是又不知道如何删除. 抱歉了...
@wysnylc 嗯嗯, 这个地方的确有点绕. 因为我以前做过 C++ 项目,对引用有另外的了解. 总的来说引用是一种安全地传递指针(即地址)的方式, 但这个地址不是 Java 引用类型对象的地址, 而是当前堆栈上变量的指针. 如果说一种简单地方法来判断是否为引用传递, 只需要看看方法内的引用改变会不会反馈到调用方法(外层堆栈)上就可以了. 也就是我上面那个 swapnum 方法做的事情
@wysnylc 我不清楚你为啥总是说我被 "一切传引用其实本质上是传值" 这句话误导. 实际情况是我在今天之前没有看到过这句话, 而且我也完全不同意这句话的说法. 传值隐含的语义是拷贝, 传引用是没有拷贝发生的, 这句话根本上就是错的.
@wysnylc 我觉得还是从字面上来讲比较好一点.

中文 英文
传值 pass by value
传引用 pass by reference

这里的中文表达并没有清晰地传递英语原意. 更准确地将应该是:

按照值方式传递函数形参 - 有拷贝发生
按照引用方式传递函数形参 - 无拷贝发生

你刚刚引用的 java-pass-by-value-or-pass-by-reference 中有下面一段话

A Java object, in contrast to Primitives, is stored in two stages. The reference variables are stored in stack memory and the object that they're referring to, are stored in a Heap memory.

Whenever an object is passed as an argument, an exact copy of the reference variable is created which points to the same location of the object in heap memory as the original reference variable.


上面第一部分将 Java 存放引用类型的机制说明地很清楚, 引用变量存储的是引用类型数据的内存地址, 也就是说变量本身的值就是引用类型数据的指针. 正因为如此, 传递引用变量的时候对值做了拷贝, 你将引用类型数据的地址通过值传递(拷贝)进了函数形参, 所以你可以操作这个引用类型数据, 但引用本身是没有传递进函数的, 因此我上面的 swapnum 函数不可能交换数据. 这个机制在第二部分说明的很清楚. 你上面说没有交换是因为他们是基本类型, 这个说法完全不正确, 因为在我上面的代码中我使用的是 Integer 而不是 int, 基本类型的包装类型, 即引用对象类型.

另一方面讲, 中文的表达 "传值" 和 "传引用" 也有 "传递值到函数形参" 和 "传递对象引用到函数形参" 的味道, 这个可能是中文传值, 传引用容易引起误解的部分原因吧.
2019-12-02 17:56:44 +08:00
回复了 imn1 创建的主题 反馈 请不要在每一个回复中都包括外链,这看起来像是在 spamming
@wysnylc 我觉得还是从字面上来讲比较好一点.

中文 英文
传值 pass by value
传引用 pass by reference

这里的中文表达并没有清晰地传递英语原意. 更准确地将应该是:

按照值方式传递函数形参 - 有拷贝发生
按照引用方式传递函数形参 - 无拷贝发生

你刚刚引用的 https://www.baeldung.com/java-pass-by-value-or-pass-by-reference 中有下面一段话
@wysnylc 我刚刚看了你贴的两个链接, 我基本上可以肯定这两个作者把"传引用"和 Java 的值类型 (基本类型, 引用类型) 搞混淆了. 文中所谓 "传引用" 实际上是传 "引用类型" 对象的值 (就是堆上的地址).

这里有关于 Java 传值还是传引用更详细的说明:
https://www.geeksforgeeks.org/g-fact-31-java-is-strictly-pass-by-value/

另外你可以到 google 上搜索 "java pass by reference" 会有一堆类似的文中, 你基本上不会找到认定 Java 是传引用的.
@wysnylc 我没有被哪句话误导.

我觉得还是先把概念定义清楚更好. 传引用这个概念我最早是从 C++ 语言学习到的. 下面是 C++ 一个传引用的例子:

void swapnum(int &i, int &j) {
int temp = i;
i = j;
j = temp;
}

这里实际上体现了传引用一个很基本的语义就是**引用是可以被重写的**. 在 C++ 中调用 swapnum 函数之后 i 和 j 的值会互换.

把上面的例子用 Java 来写就是:

void swapnum(Integer i, Integer j) {
Integer temp = i;
i = j;
j = temp;
}

你觉得 Java 能够实现交换吗? 稍微做一个小实验就知道调用 swapnum 根本就不会交换 i 和 j 的值. 原因在于 Java 根本就不传引用, 传的只是某个堆上对象指针的值.
LZ 提出的这个问题基本上就是 [ActFramework]( https://github.com/actframework/actframework) 处理 Controller 方法中的 render 参数列表解决的问题.

对于下面的控制器方法:

```java
@GetAction("/test")
public void testPage(String name, int age) {
boolean flag = ...;
render(name, age, flag);
}
```

上面的代码最后 `render` 那句就是需要为模板引擎生成一个 Map 结构:

```
"name" -> name 的值
"age" -> age 的值
"flag" -> flag 的值
```

这个操作按照常规方式无法完成. ActFramework 的做法是在加载控制器类的时候做 ASM 扫描, 从 LVT (LocalVariableTable) 区拿到变量 id 对应的变量名字, 然后再用 ASM 做类增强, 生成的方法用 Java 语言表达为:

```java
@GetAction("/test")
public void testPage(String name, int age) {
boolean flag = ...;
ActionContext context = ActionContext.current();
context.renderArg("name", name);
context.renderArg("age", age);
context.renderArg("flag", flag);
throw new RenderAny();
}
```

扫描的逻辑参考 [这段代码]( https://github.com/actframework/actframework/blob/master/src/main/java/act/controller/bytecode/HandlerEnhancer.java#L86)

增强的逻辑参考 [这个类]( https://github.com/actframework/actframework/blob/master/src/main/java/act/controller/bytecode/HandlerEnhancer.java#L140)
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3620 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 25ms · UTC 04:50 · PVG 12:50 · LAX 20:50 · JFK 23:50
Developed with CodeLauncher
♥ Do have faith in what you're doing.