标签: idioms

Java字符串参数

我来自.net背景,想知道创建一个方法的可接受方式,该方法返回一个布尔值并修改一个通过参数传入的字符串.我理解字符串在Java中是不可变的,因此下面的代码片段将始终产生一个空字符串.我被限制只返回布尔值.不能抛出例外情况.如果我需要将String类包装在一个StringHolder中,我可以在哪个包中找到它.

public static void DoStuff()
{
    String msg = "";
    if (GetMessage(msg))
    {
       System.out.println(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

java string parameters idioms

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

有用的迷你图案(不是设计图案)

我最常用的迷你图案是:

VideoLookup = new ArrayList  { new ArrayList { buttonVideo1, "Video01.flv" },
                               new ArrayList { buttonVideo2, "Video02.flv" },
                               new ArrayList { buttonVideo3, "Video03.flv" }, 
                               new ArrayList { buttonVideo4, "Video04.flv" },
                               new ArrayList { buttonVideo4, "Video04.flv" }
                             };
Run Code Online (Sandbox Code Playgroud)

这意味着,不是每个按钮都有一个case的switch语句,而是只需将单击的按钮与ArrayList中的每个项目进行比较.然后,当我找到匹配时,我启动了正确的文件(尽管第二部分"查找"的操作可能是委托或其他任何事情).

主要的好处是我没有记住为每个switch语句添加所有正确代码的问题,我只是在查找ArrayList中添加一个新项.

(是的,我知道使用ArrayList不是最好的方法,但它是旧的代码.而且我知道每次循环遍历数组不如使用switch语句那么高效,但是此代码不在紧环)

是否有其他人使用任何迷你图案可以节省时间/精力或使代码更具可读性?它们不必仅与GUI相关.

更新:不要复制这段代码,我知道这很糟糕,但我没有意识到有多糟糕.请改用这样的东西.

Hashtable PlayerLookup = new Hashtable();
PlayerLookup.Add(buttonVideo1, "Video01.flv");
PlayerLookup.Add(buttonVideo2, "Video02.flv");
PlayerLookup.Add(buttonVideo3, "Video03.flv");
PlayerLookup.Add(buttonVideo4, "Video04.flv");

string fileName = PlayerLookup[currentButton].ToString();            
Run Code Online (Sandbox Code Playgroud)

.net c# design-patterns idioms

2
推荐指数
1
解决办法
1349
查看次数

将派生值公开为属性是否是好的形式?

我需要得出7个潜在投入的重要价值.鲍勃叔叔敦促我避免使用那么多参数的函数,所以我已经提取了这个类.所有参数现在都是属性,我留下了一个没有参数的计算方法.

我认为"那个"可能是一个财产,但我不确定这是否是惯用的C#.

我应该将最终结果作为属性公开,还是作为没有参数的方法公开?一般的C#程序员会发现令人困惑或令人反感的属性吗?那么Alt.Net的人群呢?

decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious
Run Code Online (Sandbox Code Playgroud)

如果是后者:我应该将中间结果声明为[私有]属性吗?由于重法提取,我有几个中期结果.其中许多不应该是公共API的一部分.但是,其中一些可能很有趣,如果我可以将它们作为属性访问,我的表达式看起来会更清晰:

decimal interim2 = this.ImportantInterimValue * otherval;
Run Code Online (Sandbox Code Playgroud)

快乐实验部:

在VS2008中调试我的代码时,我注意到我一直将鼠标悬停在计算中间结果的方法调用上,期望将鼠标悬停在返回值上.在将所有方法转换为属性之后,我发现将中间结果公开为属性极大地帮助了调试.我很满意,但对可读性的担忧仍然存在.

临时价值声明看起来更加混乱.但是,没有括号,表达式更容易阅读.我不再觉得有必要用动词启动方法名称.对比:

// Clean method declaration; compulsive verby name; callers need
// parenthesis despite lack of any arguments.
decimal DetermineImportantInterimValue() {
    return this.DetermineOtherInterimValue() * this.SomeProperty;
}

// Messier property declaration; clean name; clean access syntax
decimal ImportantInterimValue {
    get { …
Run Code Online (Sandbox Code Playgroud)

.net c# idioms

2
推荐指数
1
解决办法
214
查看次数

在Java中将单个字符串转换为字符串的惯用方法是什么?

现在我正在使用以下内容来最小化盒装对象的创建:

String myString = "" + myChar;
Run Code Online (Sandbox Code Playgroud)

这是惯用的方式吗?(恕我直言,感觉有点尴尬.)

java idioms

2
推荐指数
1
解决办法
210
查看次数

使用post构造函数逻辑定义简洁的F#类

对于此类定义:

type Foo(f1: int, f2: string) =
member x.F1 = f1
member x.F2 = PostProcess f2
Run Code Online (Sandbox Code Playgroud)

每次访问f2时都会调用PostProcess(一些字符串操作函数)吗?如果答案是肯定的,我想避免它,那么什么是正确的习惯用法?这个是推荐的吗?这对我来说有点过于冗长.

type Foo =
val F1: int
val F2: string

new (f1, f2) as this = 
    {F1 = f1; F2 = f2;}
    then this.F2 = PostProcess(f2) |> ignore
Run Code Online (Sandbox Code Playgroud)

f# idioms

2
推荐指数
1
解决办法
384
查看次数

从[[class alloc] init]返回nil被认为是好习惯吗?

它是Objective-C中常见的习语.

我只看到[[NSImage alloc] initWithContentsOfFile:str]上使用它,它总是让我觉得有内存泄漏,因为我调用了alloc而且口头禅是:"调用alloc,你必须调用release" - 除非它其中一个你不需要的案例.

cocoa idioms

2
推荐指数
1
解决办法
861
查看次数

建议一个更清洁的功能方式

这是一些命令式代码:

var sum = 0
val spacing = 6
var x = spacing
for(i <- 1 to 10) {
  sum += x * x
  x += spacing
}
Run Code Online (Sandbox Code Playgroud)

以下是我尝试"功能化"上述代码的两个尝试:

// Attempt 1
(1 to 10).foldLeft((0, 6)) {
  case((sum, x), _) => (sum + x * x, x + spacing)
}

// Attempt 2
Stream.iterate ((0, 6)) { case (sum, x) => (sum + x * x, x + spacing) }.take(11).last
Run Code Online (Sandbox Code Playgroud)

我认为可能有更清洁,更好的功能方式来做到这一点.那会是什么?

PS:请注意,以上只是用于说明问题的示例代码; 它不是来自真正的应用程序代码.

functional-programming scala idioms

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

是否存在基于真值的"if"或"除非"的惯用Ruby方式?

x if y如果z是真的我想运行,x unless y如果z是假的话.

最惯用的方法是什么?我能想到的最好的是:

x if z ? y : !y
Run Code Online (Sandbox Code Playgroud)

ruby idioms

2
推荐指数
1
解决办法
1355
查看次数

删除-删除_惯用法-是否删除了任何内容?

我正在创建一个API,用户将调用该API从内部向量中删除项目。他们将传递条件以在向量中搜索要删除的元素。我希望我的API为找到和删除任何元素返回一个布尔值。

我打算使用“ 擦除删除”惯用语来使事情简单高效。我看不出有明显的方法可以立即检测到是否已删除项目?在删除并比较值之前,是否最好在向量中存储元素数量?

以下是此习语中的一些(未经测试的)示例代码:

std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

boolean removeMultiples(int multiple) {
    v.erase( std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;}), v.end() );
    // return true if anything was removed
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm idioms function std

2
推荐指数
1
解决办法
748
查看次数

Deep Rust匹配:有更好的方法吗?

我只是发现自己在写这篇文章:

fn init_timestamps(dir: &PathBuf, file_timestamps: &'static HashMap<PathBuf,Duration>) {

    match fs::read_dir(dir) {
        Ok(iter) => iter.for_each(|result| match result {
            Ok(entry)  => {
                if entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {
                    init_timestamps(&entry.path(), file_timestamps);
                } else {
                    match entry.metadata() {
                        Ok(md) => match md.modified() {
                            Ok(modified) => {
                                locked_timestamps.insert(entry.path(), modified.duration_since(SystemTime::UNIX_EPOCH).unwrap());
                            },
                            Err(_) => ()
                        },
                        Err(_) => ()
                    };
                }
            },
            Err(_) => ()
        }),
        Err(_) => ()
    };
}
Run Code Online (Sandbox Code Playgroud)

我不得不问:我是否缺少更好的模式?我尝试.map()在每个级别上使用,这看起来稍好一些,但是给了我关于未使用结果的编译器警告。在这种一般情况下,我想做的是“如果结果链(或选项)一直存在,则执行X。否则,不执行任何操作。” 我也遇到过类似的情况,我想强制执行链中的“失败”点false(在最深处进行布尔检查)。

实际上,这可以看作是Rust的null检查问题版本,可以使用其他语言(?.)的null-coalescing运算符解决:https : //kotlinlang.org/docs/reference/null-safety.html#safe-calls

idioms rust

2
推荐指数
1
解决办法
687
查看次数