像这样的代码经常发生:
l = []
while foo:
#baz
l.append(bar)
#qux
Run Code Online (Sandbox Code Playgroud)
如果您要将数千个元素追加到列表中,这非常慢,因为必须不断调整列表大小以适应新元素.
在Java中,您可以创建具有初始容量的ArrayList.如果您对列表的大小有所了解,那么效率会更高.
我知道像这样的代码通常可以重新考虑到列表理解中.但是,如果for/while循环非常复杂,那么这是不可行的.我们的Python程序员有没有相同的东西?
我已经编程了很长一段时间,我被告知"程序员Dvorak"键盘布局.听取人们对此的看法会有助于我决定是否应该进行转换.
我感兴趣的主要事项是:
我听说在某些语言中被称为"盒装"的类型.
在Java中,我听说过"autoboxing".这是什么?它是否有类型的包装类?如果我使用盒装或非盒装类型,我的代码会如何变化?
在bash中编写多个简单的脚本时,我常常想知道如何使代码可测试.
通常很难为bash代码编写测试,因为它在获取值并返回值的函数上很少,而在检查和设置环境中的某些方面的函数中很高,修改文件系统,调用程序等 - 依赖于环境或具有副作用的功能.因此,设置和测试代码变得比它们测试的代码复杂得多.
例如,考虑一个简单的测试函数:
function add_to_file() {
local f=$1
cat >> $f
sort -u $f -o $f
}
Run Code Online (Sandbox Code Playgroud)
此功能的测试代码可能包括:
add_to_file.before:
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
add_to_file.after:
bar
baz
foo
qux
Run Code Online (Sandbox Code Playgroud)
和测试代码:
function test_add_to_file() {
cp add_to_file.{before,tmp}
add_to_file add_to_file.tmp
cmp add_to_file.{tmp,after} && echo pass || echo fail
rm add_to_file.tmp
}
Run Code Online (Sandbox Code Playgroud)
这里有5行代码由6行测试代码和7行数据测试.
现在考虑一个稍微复杂的案例:
function distribute() {
local file=$1 ; shift
local hosts=( "$@" )
for host in "${hosts[@]}" ; do
rsync -ae ssh $file $host:$file
done
}
Run Code Online (Sandbox Code Playgroud)
我甚至不能说如何开始为此测试...
那么,有一个很好的方法在bash脚本中做TDD,还是我应该放弃并把我的努力放在别的地方?
我正在为我和其他几个人写的程序进行本地化.现在大多数字符串都是从ini文件中以适当的语言加载的.我试图用程序中的货币格式做同样的事情.但是,一旦我尝试启动应用程序,我就会收到运行时异常.
我正在使用Locale对象作为一些NumberFormat.getCurrencyInstance()的参数,如下所示:
private static final NumberFormat decf;
static
{
decf = NumberFormat.getCurrencyInstance(Lang.cLocale);
decf.setRoundingMode(RoundingMode.HALF_UP);
}
Run Code Online (Sandbox Code Playgroud)
Lang是包含所有本地化内容的类.IDE在尝试运行时抱怨的代码是public static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]);
GUI是包含GUI的类,我们决定构建DB_info数组(它本身只包含从另一个类的远程数据库加载的信息).DB_info [19]是语言代码(现在是),DB_info [20]是国家代码(US).数组元素正在被填充 - 或者说,我现在无法进入该程序; 但填充DB_info的代码没有任何改变.
完整的例外情况如下:
Exception in thread "main" java.lang.ExceptionInInitializerError
at greetingCard.GUI.<clinit>(GUI.java:118)
Caused by: java.lang.NullPointerException
at java.util.Locale.<init>(Unknown Source)
at java.util.Locale.<init>(Unknown Source)
at greetingCard.Lang.<clinit>(Lang.java:13)
... 1 more
Run Code Online (Sandbox Code Playgroud)
引用的GUI中的行是:static String welcome = Lang.L_WELCOME + ", " + empName;,而Lang.java基本上是这样的:
// Set locale for currency display
public static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]); // language, country
// Employee …Run Code Online (Sandbox Code Playgroud) java ×2
autoboxing ×1
bash ×1
dictionary ×1
dvorak ×1
list ×1
locale ×1
object ×1
python ×1
tdd ×1
terminology ×1
type-systems ×1
types ×1