问题列表 - 第1749页

命名块来限制变量范围:好主意?

多年来,我一直在使用命名块来限制临时变量的范围.我从未在其他任何地方看到过这种情况,这让我想知道这是不是一个坏主意.特别是因为Eclipse IDE默认将这些标记为警告.

我认为,在我自己的代码中,我已经使用了这个效果.但是,既然好的程序员在看到它时会不信任它,这是非惯用的,我真的有两种方法可以从这里开始:

  1. 避免这样做,或
  2. 促进它,希望它将成为一个成语.

示例(在更大的方法中):

final Date nextTuesday;
initNextTuesday: {
    GregorianCalendar cal = new GregorianCalendar();
    ... // About 5-10 lines of setting the calendar fields
    nextTuesday = cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)

这里我使用GregorianCalendar来初始化日期,我想确保我不会意外地重复使用它.

有些人评论说你实际上不需要命名块.虽然这是真的,但原始块看起来更像是一个bug,因为意图不明确.此外,命名的东西鼓励你思考块的意图.这里的目标是识别代码的不同部分,而不是为每个临时变量赋予自己的范围.

很多人评论说最好直接采用小方法.我同意这应该是你的第一直觉.但是,可能有几个缓解因素:

  • 为了考虑一个命名块,代码应该是简短的一次性代码,永远不会在其他地方调用.
  • 命名块是一种快速组织超大方法的方法,无需使用十几个参数创建一次性方法.当一个类不稳定时,尤其如此,输入可能会随版本而变化.
  • 创建一种新方法可以促进其重用,如果用例不完善,这可能是不明智的.一个命名的块更容易(在心理上,至少)丢弃.
  • 特别是对于单元测试,你可能需要为一次性断言定义十几个不同的对象,它们只是不同,你不能(还)找到一种方法将它们合并为少量的方法,你也不能想办法用一英里长的名字来区分它们.

使用命名范围的优点:

  1. 不能无意中重用临时变量
  2. 有限范围为垃圾收集器和JIT编译器提供了有关程序员意图的更多信息
  3. 块名称提供了对代码块的注释,我发现它比开放式注释更具可读性
  4. 使得将大型方法中的代码重构为小方法更容易,反之亦然,因为命名块比非结构化代码更容易分离.

缺点:

不是惯用的:没有看到使用命名块的程序员(即除了我之外的所有人)都认为它有问题,因为他们无法找到对块名称的引用.(就像Eclipse一样.)让事情成为惯用语是一场艰苦的战斗.

它可以作为不良编程习惯的借口,例如:

  • 制作庞大的,单一的方法,其中几种小方法更易读.
  • 压痕层太深,无法轻易阅读.

注意:基于一些深思熟虑的回答,我已经广泛地编辑了这个问题.谢谢!

java coding-style

46
推荐指数
5
解决办法
7148
查看次数

使用正则表达式替换Ruby中引号中的所有空格

我正在尝试编写一个正则表达式来替换所有未包含在引号中的空格,所以这样的事情:

a = 4, b = 2, c = "space here"
Run Code Online (Sandbox Code Playgroud)

会回来这个:

a=4,b=2,c="space here"
Run Code Online (Sandbox Code Playgroud)

我花了一些时间搜索这个网站,我发现了一个类似的q/a(用空格分割一个字符串 - 保留引用的子串 - 在Python中),它将用一个可以在之后重新替换的标记替换引号内的所有空格擦拭所有其他空间...但我希望有一种更清洁的方式.

ruby regex

4
推荐指数
2
解决办法
9292
查看次数

openGL SubTexturing

我有图像数据,我想得到一个用作opengl纹理的子图像.

glGenTextures(1, &m_name);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldName);
glBindTexture(GL_TEXTURE_2D, m_name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
Run Code Online (Sandbox Code Playgroud)

如何获得作为纹理加载的图像的子图像.我认为它与使用glTexSubImage2D有关,但我不知道如何使用它来创建我可以加载的新纹理.呼叫:

glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, xWidth, yHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
Run Code Online (Sandbox Code Playgroud)

我什么都看不到,调用glCopyTexSubImage2D只是占用了我的帧缓冲区.谢谢

c++ opengl

8
推荐指数
1
解决办法
9946
查看次数

如何创建可选择搜索列的存储过程?

我正在研究将要查询我们员工数据库的工作申请.最终用户希望能够根据标准名称/部门标准进行搜索,但他们也希望能够灵活地查询所有在健康部门工作的名字为"James"的人.我想要避免的一件事是简单地让存储过程获取参数列表并生成要执行的SQL语句,因为这将在内部级别打开SQL注入的大门.

可以这样做吗?

sql sql-server parameters search stored-procedures

9
推荐指数
3
解决办法
3万
查看次数

传递可变数量的参数

假设我有一个带有可变数量参数的C函数:如何调用另一个函数,该函数需要从其内部获取可变数量的参数,并将所有参数传递到第一个函数中?

例:

void format_string(char *fmt, ...);

void debug_print(int dbg_lvl, char *fmt, ...) {
    format_string(fmt, /* how do I pass all the arguments from '...'? */);
    fprintf(stdout, fmt);
 }
Run Code Online (Sandbox Code Playgroud)

c variadic-functions

325
推荐指数
7
解决办法
17万
查看次数

来自Web服务调用的XML

Visual Studio使调用Web服务变得容易,试图弄清楚幕后发生的事情很困难.

在调用Web服务时,如何查看从.Net应用程序生成的实际XML?

xml web-services fiddler visual-studio tcptrace-pocketsoap

9
推荐指数
1
解决办法
6446
查看次数

从Collection/Array/List创建以逗号分隔的字符串的最复杂方法?

在我使用数据库的过程中,我注意到我编写了查询字符串,在这个字符串中,我必须在list/array/collection的where子句中加入一些限制.应该是这样的:

select * from customer 
where customer.id in (34, 26, ..., 2);
Run Code Online (Sandbox Code Playgroud)

您可以通过将此问题简化为具有字符串集合的问题并希望仅在一个字符串中创建此字符串的逗号分隔列表来简化此操作.

我到目前为止使用的方法是这样的:

String result = "";
boolean first = true;
for(String string : collectionOfStrings) {
    if(first) {
        result+=string;
        first=false;
    } else {
        result+=","+string;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是你可以看到非常丑陋的.您无法看到第一眼看到的情况,特别是当构造的字符串(如每个SQL查询)变得复杂时.

你(更)优雅的方式是什么?

java sql string

97
推荐指数
10
解决办法
14万
查看次数

你如何组织你的ATG项目?

如果您为ATG Dynamo开发,您如何构建模块和依赖项?

你如何构建项目?源目录,JAR配置等.

你如何构建和部署?你用什么工具?

atg atg-dynamo

9
推荐指数
1
解决办法
3664
查看次数

有没有琐碎的财产保存你的培根?

那里有很多建议你不应该公开地公开你的字段,而是使用普通的属性.我一遍又一遍地看到它.

我理解这些论点,但在大多数情况下我认为这不是一个好建议.

有没有人有一个真正重要的时间的例子?在写一个琐碎的财产时,将来可能会有一些重要的事情(或者当没有使用它时会让他们陷入真正的麻烦)?

编辑:DataBinding参数是正确的,但不是很有趣.DataBinding代码中的一个错误是它不接受公共字段.因此,我们必须编写属性来解决该bug,而不是因为属性是明智的类设计选择.

编辑:要清楚,我正在寻找现实世界的例子,而不是理论.真正重要的时刻.

编辑:在setter上设置断点的能力似乎很有价值.为调试器设计我的代码是不幸的:我宁愿调试器变得更聪明,但考虑到我们的调试器,我将采用这种能力.好东西.

.net c#

19
推荐指数
5
解决办法
2679
查看次数

在运行时,查找扩展基类的Java应用程序中的所有类

我想做这样的事情:

List<Animal> animals = new ArrayList<Animal>();

for( Class c: list_of_all_classes_available_to_my_app() )
   if (c is Animal)
      animals.add( new c() );
Run Code Online (Sandbox Code Playgroud)

所以,我想查看我的应用程序的Universe中的所有类,当我找到一个来自Animal的类时,我想创建一个该类型的新对象并将其添加到列表中.这允许我添加功能而无需更新事物列表.我可以避免以下情况:

List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Run Code Online (Sandbox Code Playgroud)

通过上面的方法,我可以简单地创建一个扩展Animal的新类,它将自动被拾取.

更新:2008年10月16日上午9:00太平洋标准时间:

这个问题引起了很多很好的回应 - 谢谢.从回答和我的研究中,我发现我真正想要做的就是在Java下不可能.有一些方法,比如ddimitrov的ServiceLoader机制可以工作 - 但它们对我想要的东西非常重,我相信我只是将问题从Java代码转移到外部配置文件.

另一种表达我想要的方式:我的Animal类中的静态函数查找并实例化从Animal继承的所有类 - 无需任何进一步的配置/编码.如果我必须配置,我也可以在Animal类中实例化它们.我理解,因为Java程序只是一个松散的.class文件联合体,就像它一样.

有趣的是,在C#中,这似乎相当微不足道.

java reflection inheritance

139
推荐指数
5
解决办法
14万
查看次数