1

我有以下内容:

public class Mail {
  public String Obfuscate(String email) {
    return email.Replace("@", "at").Replace(".", "dot");
  }
}

我在一个类中调用了Obfuscate方法,如下:

public class Resolver {
  public Data GetData () {
    return new Data { Email = new Mail().Obfuscate(myEmail) };
  }
  public String Translate(string value) { /* Some Code */ }
}

问题是 Obfuscate 用英语进行替换:@ > at, 。> 点

但是在 Resolver 类中,Translate 方法正是我需要的......

如何将 Translate 方法“传递”给 Obfuscate 方法,以便使用它来翻译 @ 和 . 在当前语言中使用 at 和 dot 吗?

所以Obfuscate里面的代码行:

return email.Replace("@", "at").Replace(".", "dot");

会变成:

return email.Replace("@", Translate("@")).Replace(".", Translate("."));

翻译将是我“传递”给它的方法。

比你,米格尔

4

2 回答 2

3

考虑一个不同的设计:

public interface ITranslator
{
    string Translate(string s);
}

public class Obfuscator
{
    public Obfuscator(ITranslator translator)
    {
        this.translator = translator;
    }

    public string Obfuscate(string email)
    {
       var at = translator.Translate("at");
       var dot = translator.Translate("dot");

       return email.Replace("@", at).Replace(".", dot);
    }

    private ITranslator translator;
}

public class EnglishTranslator : ITranslator
{
    public string Translate(string s)
    {
        return s;
    }
}

public class PolishTranslator : ITranslator
{
    public PolishTranslator() //or `FileInfo dictionaryFile` parameter perhaps
    {
        // for simplicity
        translations = new Dictionary<string, string>();
        translations.Add("at", "malpa");
        translations.Add("dot", "kropka");
    }

    public string Translate(string s)
    {
        return translations[s];
    }

    private Dictionary<string, string> translations;
}

但是,您确实应该考虑使用ResourceManager. 资源相关机制旨在处理翻译。

于 2013-10-20T14:19:13.310 回答
2

我认为@BartoszKP 的答案是正确的设计决策。为了完整起见,这里是如何做你问的。

更改邮件以获取Func<string,string>

public class Mail {
  public String Obfuscate(String email, Func<string,string> translate) {
    return email.Replace("@", translate("at")).Replace(".", translate("dot"));
  }
}

并将您的Translate方法传递给它:

public class Resolver {
  public Data GetData () {
    return new Data { Email = new Mail().Obfuscate(myEmail, Translate) };
  }
  public String Translate(string value) { /* Some Code */ }
}
于 2013-10-20T14:26:42.213 回答