【问题标题】:Are there more effective or efficient ways to code lengthy texts?是否有更有效或更高效的方法来编码冗长的文本?
【发布时间】:2016-09-04 07:09:03
【问题描述】:

我有一个应用程序,其中包含许多冗长的工具提示。例如,我有一个这样的工具提示的代码,如下所示:-

//Less SSA (ATi-SSA) (as coded in a header)
std::string GetLessSSA_tt() {
    std::string less_ssastr = "Less SSA = The amount after deducting the SSA from the ATI.";
    less_ssastr.append("\n\nAs such reducing the amount used for calculation purposes");
    //etc
    return less_ssastr;
}

 ......

//Coded at various places not within the header
std::string tooltip = GetLessSSA_tt();

我认为头文件可能是最适合分离数据和代码,避免数据重复的地方。

我愿意接受有关将数据放置在何处的建议(我会排除文件/数据库,但由于需要更多编码和拥有数据,这些数据很少需要更新、遥远并且可能容易被滥用,例如可以更改文件)。

真正的问题是文本存储的实际编码。会有相当数量的。上面的示例是较小文本之一的简化​​/极简示例。将至少有 27 个主题(解释的术语),这相当于使用示例方法,相当于 27 个函数,每个函数可能至少有 5 行文本。

我猜,数组/双端队列/结构都会增加重复。

我目前对使用预处理器命令/宏的知识和能力非常有限。我所有使用“#defines”的尝试都失败了。

我相信,也许是错误的,预处理器命令可能会限制可移植性(不是真正的问题)。但是,我怀疑也许预处理器可以提高编码效率。

我想要达到的目标总结是

“将文本字符串周围的clutter 减少到最低限度。主要是它们的定义,但也要考虑后续使用。”

【问题讨论】:

  • 您是否考虑过从某种文件中读取它?这将允许在没有程序的情况下更改文本,而且开发人员不需要全部编写(您的 QA 部门可以编写文本等)
  • 是的,我实际上有这个用于每年变化的数据。但是,不是数据会发生变化,或者很少发生变化,如果要发生变化,可能是因为编码更改会适用。文本是解释性术语,8 年多来一直保持不变,没有任何改变的迹象。例如SSA 代表 Self-Support Amount.......
  • P.S.开发人员 dpt 是我,QA dpt 是我,等等等等 :)
  • 如果这是在 Windows 上,请考虑将文本作为文本资源存储在应用程序中。这样,如果有一天有必要,将您的应用程序翻译成另一种语言或更改消息也会更容易。无需重新编译即可编辑资源。而且它们不会弄乱您的源代码。我猜其他平台也有类似的方式在应用中存储文本和图像等。
  • 那为什么不把函数定义在头文件中,把实现放到cpp文件中,这样可以消除重复文本呢?

标签: c++ string tooltip c-preprocessor mingw32


【解决方案1】:

我会把它放在一个单独的 C++ 文件中,应该使用简单的常量:

工具提示.h:

namespace Whatever
{
extern std::string const ToolTip1;
extern std::string const ToolTip2;
}

tooltip.cpp:

namespace Whatever
{
std::string const ToolTip1(
        "some lengthy tooltip\n"
        "with several lines"
        );
std::string const ToolTip2(
        "a shorter one"
        );
}

如果你更喜欢函数:

工具提示.h:

namespace Whatever
{
std::string const& toolTip1();
std::string const& toolTip2();
}

tooltip.cpp:

namespace Whatever
{
namespace
{
std::string const ToolTip1(
        "some lengthy tooltip\n"
        "with several lines"
        );
std::string const ToolTip2(
        "a shorter one"
        );
}

std::string const& toolTip1() { return ToolTip1; }
std::string const& toolTip2() { return ToolTip2; }
}

我不会将常量放在头文件中 - 你首先将单个编译单元中的常量相乘,依赖链接器发现相同的字符串让我感到不舒服...

编辑: 考虑到 MikeT 的 cmets 和(被拒绝的)编辑:

工具提示.h:

namespace Whatever
{
extern char const* const ToolTip1;
extern char const* const ToolTip2;
}

工具提示.cpp:

namespace Whatever
{
char const* const ToolTip1 = "theToolTip";
char const* const ToolTip2 = "theToolTip";
}

用法:

// before:
// addToolTip(getToolTip1().c_str());
// now:
addToolTip(ToolTip1);

只要全局只有一个头文件包含(在一个源文件中,并且不包含在其他头文件中),将定义从 tooltip.cpp 文件移动到头文件并删除源文件。不过,我认为这是不安全的,因为一旦这一事实发生变化,这可能会导致链接器出现问题。按照我的建议,将头文件和源文件分开可以防止现在和将来出现问题。

此外,它使在编译时交换语言变得容易,我们可以简单地这样做:

gcc main.cpp, something.cpp, tooltip_en-GB.cpp -o theApplication # English translation
gcc main.cpp, something.cpp, tooltip_es-ES.cpp -o theApplication # Spanish translation
# ...

【讨论】:

  • 我一定会尝试调整您发布的内容。我认为我的问题之一是连接(不喜欢使用 'mystring.append("more stuff");' 所以 std::string const mystring("text" "more");' 似乎克服了一个主要问题 混乱。不需要发现相同的字符串,也许我不应该提到重复。我只使用函数来解决我无法连接的问题,所以不需要我可以将字符串变量放入工具提示添加函数中.
  • @MikeT 我将“复制”解释为“在几个不同的编译单元中编码相同的字符串文字”——我认为你想避免这种情况——这是有充分理由的。这就是为什么我将常量放入 cpp 文件并在标题中将它们声明为 extern...
  • 刚刚测试了一个适配。我使用了您在第二块中提供的内容(不需要extern),只是在头文件中编码了std::string const mystring("text" "more");,并使用了addtooltip(hwnd,ttwnd,(LPTSTR)mystring);,基本上就是我想要的。所以将此标记为答案。只是想先检查一下。 PS如果我在标头而不是cpp中做错了,我很感激知道为什么(仍然是c ++和windows的新手)。
  • 我真的很喜欢这样,因为现在我可以用空行分隔段落/句子,在我看来,这使得它更具可读性。再次感谢。
  • Ooops 错误在上面我忘了包括.c_str()。所以addtooltip(hwnd,ttwnd,(LPTSTR)mystring); 应该是addtooltip(hwnd,ttwnd,(LPTSTR)mystring.c_str());
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 2021-09-28
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多