问题标签 [interface-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1213 浏览

android - Android 应用程序的标签与主屏幕?

我有一个我一直在开发的 Android 应用程序,它是使用选项卡来实现的,以分隔它执行的不同功能。

请参阅此处的文章

上面的文章讨论了由于选项卡的一些限制,他们决定使用主屏幕和工具栏而不是使用选项卡来实现 Twitter 应用程序。

如果我的应用程序只需要三个选项卡(或 3 个主屏幕图标),我是否值得花时间返回并将我的应用程序转换为主屏幕布局,或者主屏幕与选项卡纯粹是一个偏爱?

主屏幕示例
(来源:blogspot.com

主屏幕示例 (来源:simplydroid.com选项卡示例

选项卡示例

0 投票
1 回答
163 浏览

c++ - 将任意类类型中的字段专用于“外部使用”

我的容器需要存储一些关于其元素的信息。通常,我将其与元素分开存储。但是,我想通过将元素结构类型中的一个字段专用于外部使用,为用户提供节省内存的可能性。例如:

这里的想法是,除了元素的容器之外,任何东西都不能访问该字段。由于容器存储一个副本(很像),因此如果您将任何给定值添加到多个容器中std::vector,这将不是问题。x

如果可能,您将如何为此设计一个满足以下要求的界面?

  • 应该是完全可选的。即应该可以自动确定给定类型是否提供这样的字段,然后容器将仅在可用时使用它。
  • 理想情况下,不依赖于类型特征等,因为我需要最大的编译器兼容性。
  • 应该很容易使用。即,如果您可以并且想要为 type 启用此优化MyStuff,则可以使用 3 行代码而不是 25 行代码来实现。另一方面,内部复杂性无关紧要。
  • 最好应完全排除误报。我的意思是:如果您检查字段foo_bar,则存在这种字段的可能性很小,因为完全不相关的原因(我认为鸭子类型根本不适用于 C++)。更好的方法是检查类型是否ProvidesExternalUseField从我的库中继承标记类,因为这不是偶然的。

编辑

我知道 Boost.Intrusive,但我想要的是不同的东西。如果我这样做并创建一个具有单个char字段的钩子类,则在许多情况下它不能用于节省内存。如果继承的类型有一个intas first 字段,则该char字段将被填充为 4 个字节。即,您通常需要复杂的类型内部知识才能“挤压”此类外部使用字段,但继承并没有真正提供它:

在这里,大小MyStuff将是 12 个字节,而不是 8 个。

0 投票
1 回答
6531 浏览

python - 设计 Python API:流畅的接口或参数

我正在使用Protovis API 到 Python 的简单端口。

考虑使用 Javascript 的简单条形图示例:

我正在争论是继续使用这种流畅的界面风格 API 还是使用命名参数。使用命名参数,我们可以编写:

有首选的 Python 风格吗?

0 投票
2 回答
385 浏览

c# - 如何设计我的 C# jQuery API 使其使用起来不会令人困惑?

我正在为 C#制作一个 jquery 克隆。现在我已经把它设置好了,每个方法都是一个扩展方法,IEnumerable<HtmlNode>所以它可以很好地与已经使用的现有项目一起工作HtmlAgilityPack。我以为我可以在不保留状态的情况下逃脱……但是,然后我注意到 jQuery 有两种方法.andSelf.end它们将最近匹配的元素从内部堆栈中“弹出”。如果我更改我的类以便它始终在 SharpQuery 对象而不是枚举对象上运行,我可以模仿这个功能,但仍然存在问题。

使用 JavaScript,您会自动获得 Html 文档,但在使用 C# 时,您必须显式加载它,如果您愿意,可以使用多个文档。看来,当您调用时,$('xxx')您实际上是在创建一个新的 jQuery 对象并从一个空堆栈重新开始。在 C# 中,您不想这样做,因为您不想从 Web 重新加载/重新获取文档。因此,您只需将其加载到 SharpQuery 对象或 HtmlNode 列表中(您只需要 DocumentNode 即可开始)。

在 jQuery 文档中,他们给出了这个例子

我没有初始化方法,因为我不能重载()运算符,所以你只需从它开始sq.Find(),它在文档的根目录上运行,基本上做同样的事情。但是然后人们会尝试sq.Find()在一行上写,然后在sq.Find()某个地方,并且(正确地)期望它再次在文档的根目录上运行......但如果我保持状态,那么你已经刚刚在第一次调用后修改了上下文。

那么......我应该如何设计我的 API?我是否添加了另一种Init方法,所有查询都应该以重置堆栈开始(但是我如何强制它们开始呢?),或者添加一个Reset()他们必须在行尾调用的方法?我是否要重载[]而不是告诉他们从那开始?我会说“算了吧,反正没人使用那些状态保留的函数吗?”

基本上,您希望如何用 C# 编写 jQuery 示例?

  1. sq["ul.first"].Find(".foo") ...
    缺点:滥用[]财产。

  2. sq.Init("ul.first").Find(".foo") ...
    缺点:没有什么能真正迫使程序员从 Init 开始,除非我添加一些奇怪的“初始化”机制;用户可能会尝试开始,.Find但没有得到他期望的结果。而且,Init无论如何Find都几乎相同,除了前者也重置堆栈。

  3. sq.Find("ul.first").Find(".foo") ... .ClearStack()
    缺点:程序员可能会忘记清除堆栈。

  4. 做不到。
    end()未实现。

  5. 使用两个不同的对象。
    也许使用HtmlDocument作为所有查询应该开始的基础,然后每个方法都返回一个SharpQuery可以链接的对象。这样,HtmlDocument始终保持初始状态,但SharpQuery对象可能具有不同的状态。不幸的是,这意味着我必须两次实现一堆东西(一次用于 HtmlDocument,一次用于 SharpQuery 对象)。

  6. new SharpQuery(sq).Find("ul.first").Find(".foo") ...
    构造函数复制对文档的引用,但重置堆栈。

0 投票
2 回答
101 浏览

c++ - 返回一个向量,知道它将始终包含一条记录,以便与接口的其余部分保持一致?

我正在编写一个小地址簿应用程序,并且在数据源/后端的接口方面存在设计困境。

我有以下数据源类的抽象基类:

下面是我的记录结构,tmy 记录集是这些对象的 STL 向量的 typedef。

我的问题涉及用于 DataSource::getContact() 方法和 DataSource::getAllContacts() 方法的返回值类型以及即将添加的搜索方法,它将根据查询获取记录。

DataSource::getContact() 将返回零或 1 条记录,因为我正在通过唯一 ID 查找。DataSource::getAllContacts() 将返回零个或多个联系人。即将到来的搜索方法将返回零个或多个联系人。

正如我现在所拥有的那样,getContact() 方法正在将 auto_ptr 返回给联系人,因为如果我确定它们永远不会超过一个,那么返回 ContactRecordSet 似乎很浪费,并且如果没有记录,它允许我返回 NULL有那个id。

让 getContact() 也返回一个 ContactRecordSet 会更好吗,只是为了让接口保持一致?

我的一部分对为单个对象返回类似的数据结构的想法感到恼火,但另一方面它更加一致,并且用于检查是否为该 id 找到值的语义似乎更符合整体抽象设计(检查返回记录集的长度与检查 NULL auto_ptr)。

大家怎么看?

(注意 - 我知道我可能对一个简单的地址簿应用程序进行了过度设计,但我希望能够轻松交换不同的后端(平面文件、SQL 等),前提是它们实现了常见的接口。目标是实践良好的模块化设计和关注点分离。)

更新

我想我可以从相反的角度来看,并使多个记录方法将 auto_ptrs 返回到 ContactRecordSet objectcs。那样a)它是一致的,因为你总是得到一个指向对象的指针,b)如果记录集为空,你没有返回 std::vector 的开销,只需返回一个 NULL 指针。

0 投票
2 回答
3168 浏览

c# - 使用界面时的最佳实践

很多时候,在设计界面时,我都会遇到同样的情况。这种情况是使用接口的某些实现需要接口中的特定参数,而其他实现不需要。

  • 设计界面时的最佳实践是什么?
  • 是否可以让某些实现实现接口但不使用所有参数?

或者在这些情况下,我是否应该只接受参数列表(某种结构)并在每个实现中相应地处理该列表?

0 投票
1 回答
119 浏览

asp.net - 暗示某种实现的接口有什么好处?

我正在看这个:

所以页面实现了这个接口,最终看起来像这样:

据我所知,这个接口只是确保程序员必须考虑存储来自 to 的响应,RaiseCallbackEvent然后从调用 to 中返回GetCallbackResult

我看不出这种技术有什么真正的好处,因为你已经必须实现并考虑两种方法来做到这一点。

您的想法 - 这种方法有什么有效的好处,还是只是代码味道?

0 投票
3 回答
325 浏览

c# - 如何用接口ID之类的东西替换枚举?

请考虑以下接口:

我认为 ContentType 枚举是多余的。有没有办法使用接口标识符而不是枚举类型?

非常感谢对界面设计的任何评论。

0 投票
0 回答
65 浏览

.net - 覆盖接口定义

可能重复:
为什么无法覆盖仅 getter 属性并添加 setter?

假设我有以下接口:

问题是我希望IReponse界面有一个设置器:

  1. 为什么不允许这样做?
  2. 如果我这样做会遇到什么样的问题new bool KeepAlive { get; set; }

更新:

我读了另一个问题,它说预计财产不会改变。我不同意。让我们以Socket.Connected财产为例。它只有一个吸气剂,但可以更改。只读属性的意思是该属性只能实现中更改。

0 投票
9 回答
7482 浏览

javascript - 开发大型 JavaScript 应用程序的最佳实践

我在 Java/C++ 方面有很强的背景,我想知道是否有可能在不降低质量的情况下开发一个更大的 JavaScript 应用程序。

任何提示都表示赞赏:

  • 发展环境
  • 调试技术
  • 单元测试
  • 剖析
  • 仪器仪表
  • 系统设计
  • 界面设计
  • 代码设计

我也很好奇JavaScript PC EmulatorJavaScript Game Engine等项目是如何处理这些问题的,以防你们中的一些人知道。