【问题标题】:Is there any benefit to using an object instead of several variables?使用一个对象而不是几个变量有什么好处吗?
【发布时间】:2018-03-14 14:15:36
【问题描述】:

我正在用 nodeJS 编写一个应用程序 - 一个 Facebook Messenger 应用程序。

我的应用程序包含一个名为 strings.js 的模块,它基本上用于存储常见的字符串。任何时候我需要打印问候语或从 strings.js 文件中提取的任何内容。 Strings.js 看起来像这样:

/*
* This module exports common strings.
* */
'use strict';
module.exports = {
    // Quick replies for user to choose age range
    ageReplies:[
    {
        //Option 1 CODE
    },
    {
        //Option 2 CODE
    },
    {
        //Option 3 CODE
    }],

    // Quick replies for user to choose gender
    genderReplies:[
    {
        //Option 1 CODE
    },
    {
        //Option 2 CODE
    },
    {
        //Option 3 CODE
    }],

    // 'greetingButtons' is used to create the buttons sent to a registered 
    // user during the greeting
    greetingButtons: [
    {
        //BUTTON 1 CODE
    },
    {
        //BUTTON 2 CODE
    }, 
    {
        //BUTTON 3 CODE
    }],

    userAgeString: "How old are you?",
    userGenderString: "What's your gender?",
    userInitialGreetingString: "Hello there!  I don't believe we've spoken before.  You'll need to create a user profile, so let's do that now.",
    userNamePromptString: "What would you like me to call you?",
    userPrefNamePromptString: "Ok, what would you like me to call you instead? Type it below:",
    userWelcomeGreetingString: "Welcome back! I am ready and willing to serve, as always!",
};

前两个“对象”(如果我们可以这样称呼的话)“ageReplies”和“GenderReplies”用于在 Facebook Messenger 中询问用户性别和年龄时(在创建用户个人资料期间)生成快速回复。

接下来是“greetingButtons”,用于创建按钮,这些按钮会发送给先前注册的用户,并带有“您接下来想做什么?”消息。

最后我有一些字符串用于问候用户,提示他们输入性别和年龄,等等。随着我添加它们,它们会更多。

我一直在考虑将这些单独的字符串放在一个对象中,例如如下:

stringData: {
    userAgeString: "How old are you?",
    userGenderString: "What's your gender?",
    userInitialGreetingString: "Hello there!  I don't believe we've spoken before.  You'll need to create a user profile, so let's do that now.",
    userNamePromptString: "What would you like me to call you?",
    userPrefNamePromptString: "Ok, what would you like me to call you instead? Type it below:",
    userWelcomeGreetingString: "Welcome back! I am ready and willing to serve, as always!",
},

这样做有什么好处吗?有什么意义吗?

另一个问题是,如果我确实使用了这样的对象,是否可以将我的按钮和快速回复放在同一个对象中,例如如下:

stringData: {
    ageReplies:[ /* Age reply code */ ],
    genderReplies: [ /* Gender reply code */ ],
    greetingButtons: [ /* Button code */ ],
    userAgeString: "How old are you?",
    userGenderString: "What's your gender?",
    userInitialGreetingString: "Hello there!  I don't believe we've spoken before.  You'll need to create a user profile, so let's do that now.",
    userNamePromptString: "What would you like me to call you?",
    userPrefNamePromptString: "Ok, what would you like me to call you instead? Type it below:",
    userWelcomeGreetingString: "Welcome back! I am ready and willing to serve, as always!",
},

这行得通吗?

编辑:澄清一下,我不是说在我的主代码中有一个对象。我正在谈论的对象将在 strings.js 中

【问题讨论】:

  • 从本地化的角度来看,我会说坚持使用 Strings.js,与在代码中创建对象相比,从一个文件更新和维护并引用该文件要容易得多。
  • 澄清一下:我的意思是让我的字符串作为 strings.js 中的一个对象,而不是让它们作为 strings.js 中的单独变量

标签: node.js object


【解决方案1】:

通常在编写涉及显示某种文本的程序时,我将所有副本(最终发送给用户的文本)存储在它自己的文件中。这些文本块有一个变量名,就像你所做的那样,这让我可以在系统中引用它们。

我为什么要这样做?国际化(通常缩写为 i18n)。

将显示的文本与应用程序的其余部分分开是很常见的做法,这样您就可以轻松地为文本创建多个文件并根据用户的语言设置(或区域设置)从正确的文件加载。

在这种情况下,每种口语都有一个字符串文件,其中的变量名称都是相同的。然后,您可以根据设置/语言环境从特定文件中进行选择。

仅出于这个原因,我将所有文本与应用程序的其余部分分开。当它是基于 HTML 的项目等时,这不太适用,但会遇到诸如 nodejs 服务器端错误之类的问题消息,它工作得很好。

就我个人而言,当我构建机器人时,选项(按钮)的数量与我使用的文本无关。所以我创建不同选项的代码发生在其他地方,但将使用我的 i18n 模块提供的字符串。这样文本和按钮就可以很好地分离。通常按钮创建发生在一个函数中,该函数采用某种对象数组来表示每个按钮的选项,然后我会在创建最终按钮标记时从我的 i18n 文件中提取文本。

附带说明:我也没有标记诸如“字符串”前缀或后缀之类的东西,指的是 i18n.welcomeGreeting 或只是 welcomeGreeting,我发现这对于这些东西来说已经足够明确了。

Tl;dr

目前这两种方法都不会产生很大的不同,但是如果您的应用程序将来可能会增长,那么将您的文本与按钮创建分离可以带来有用的好处。它通常还可以使其更易于使用,并将按钮与文本分开。毕竟,您并不总是在聊天机器人中同时使用这两者,因此它们可能应该是不同的关注点。

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2011-12-09
    相关资源
    最近更新 更多