问题标签 [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.
android - Android 应用程序的标签与主屏幕?
我有一个我一直在开发的 Android 应用程序,它是使用选项卡来实现的,以分隔它执行的不同功能。
上面的文章讨论了由于选项卡的一些限制,他们决定使用主屏幕和工具栏而不是使用选项卡来实现 Twitter 应用程序。
如果我的应用程序只需要三个选项卡(或 3 个主屏幕图标),我是否值得花时间返回并将我的应用程序转换为主屏幕布局,或者主屏幕与选项卡纯粹是一个偏爱?
(来源:blogspot.com)
主屏幕示例
(来源:simplydroid.com)
选项卡示例
c++ - 将任意类类型中的字段专用于“外部使用”
我的容器需要存储一些关于其元素的信息。通常,我将其与元素分开存储。但是,我想通过将元素结构类型中的一个字段专用于外部使用,为用户提供节省内存的可能性。例如:
这里的想法是,除了元素的容器之外,任何东西都不能访问该字段。由于容器存储一个副本(很像),因此如果您将任何给定值添加到多个容器中std::vector
,这将不是问题。x
如果可能,您将如何为此设计一个满足以下要求的界面?
- 应该是完全可选的。即应该可以自动确定给定类型是否提供这样的字段,然后容器将仅在可用时使用它。
- 理想情况下,不依赖于类型特征等,因为我需要最大的编译器兼容性。
- 应该很容易使用。即,如果您可以并且想要为 type 启用此优化
MyStuff
,则可以使用 3 行代码而不是 25 行代码来实现。另一方面,内部复杂性无关紧要。 - 最好应完全排除误报。我的意思是:如果您检查字段
foo_bar
,则存在这种字段的可能性很小,因为完全不相关的原因(我认为鸭子类型根本不适用于 C++)。更好的方法是检查类型是否ProvidesExternalUseField
从我的库中继承标记类,因为这不是偶然的。
编辑
我知道 Boost.Intrusive,但我想要的是不同的东西。如果我这样做并创建一个具有单个char
字段的钩子类,则在许多情况下它不能用于节省内存。如果继承的类型有一个int
as first 字段,则该char
字段将被填充为 4 个字节。即,您通常需要复杂的类型内部知识才能“挤压”此类外部使用字段,但继承并没有真正提供它:
在这里,大小MyStuff
将是 12 个字节,而不是 8 个。
python - 设计 Python API:流畅的接口或参数
我正在使用Protovis API 到 Python 的简单端口。
考虑使用 Javascript 的简单条形图示例:
我正在争论是继续使用这种流畅的界面风格 API 还是使用命名参数。使用命名参数,我们可以编写:
有首选的 Python 风格吗?
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 示例?
sq["ul.first"].Find(".foo") ...
缺点:滥用[]
财产。sq.Init("ul.first").Find(".foo") ...
缺点:没有什么能真正迫使程序员从 Init 开始,除非我添加一些奇怪的“初始化”机制;用户可能会尝试开始,.Find
但没有得到他期望的结果。而且,Init
无论如何Find
都几乎相同,除了前者也重置堆栈。sq.Find("ul.first").Find(".foo") ... .ClearStack()
缺点:程序员可能会忘记清除堆栈。做不到。
end()
未实现。使用两个不同的对象。
也许使用HtmlDocument
作为所有查询应该开始的基础,然后每个方法都返回一个SharpQuery
可以链接的对象。这样,HtmlDocument
始终保持初始状态,但SharpQuery
对象可能具有不同的状态。不幸的是,这意味着我必须两次实现一堆东西(一次用于 HtmlDocument,一次用于 SharpQuery 对象)。new SharpQuery(sq).Find("ul.first").Find(".foo") ...
构造函数复制对文档的引用,但重置堆栈。
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 指针。
c# - 使用界面时的最佳实践
很多时候,在设计界面时,我都会遇到同样的情况。这种情况是使用接口的某些实现需要接口中的特定参数,而其他实现不需要。
- 设计界面时的最佳实践是什么?
- 是否可以让某些实现实现接口但不使用所有参数?
或者在这些情况下,我是否应该只接受参数列表(某种结构)并在每个实现中相应地处理该列表?
asp.net - 暗示某种实现的接口有什么好处?
我正在看这个:
所以页面实现了这个接口,最终看起来像这样:
据我所知,这个接口只是确保程序员必须考虑存储来自 to 的响应,RaiseCallbackEvent
然后从调用 to 中返回GetCallbackResult
。
我看不出这种技术有什么真正的好处,因为你已经必须实现并考虑两种方法来做到这一点。
您的想法 - 这种方法有什么有效的好处,还是只是代码味道?
c# - 如何用接口ID之类的东西替换枚举?
请考虑以下接口:
我认为 ContentType 枚举是多余的。有没有办法使用接口标识符而不是枚举类型?
非常感谢对界面设计的任何评论。
.net - 覆盖接口定义
假设我有以下接口:
问题是我希望IReponse
界面有一个设置器:
- 为什么不允许这样做?
- 如果我这样做会遇到什么样的问题
new bool KeepAlive { get; set; }
。
更新:
我读了另一个问题,它说预计财产不会改变。我不同意。让我们以Socket.Connected
财产为例。它只有一个吸气剂,但可以更改。只读属性的意思是该属性只能在实现中更改。
javascript - 开发大型 JavaScript 应用程序的最佳实践
我在 Java/C++ 方面有很强的背景,我想知道是否有可能在不降低质量的情况下开发一个更大的 JavaScript 应用程序。
任何提示都表示赞赏:
- 发展环境
- 调试技术
- 单元测试
- 剖析
- 仪器仪表
- 系统设计
- 界面设计
- 代码设计
我也很好奇JavaScript PC Emulator和JavaScript Game Engine等项目是如何处理这些问题的,以防你们中的一些人知道。