拖放控制 - 邪恶?
Posted
技术标签:
【中文标题】拖放控制 - 邪恶?【英文标题】:Drag n' Drop Controls - Evil? 【发布时间】:2010-10-02 17:32:18 【问题描述】:我无法忍受像线程和计时器这样的拖放控件。这些控制感觉与它们存在的实际本质相去甚远。拖放线程?我希望 Drag n' Dropper 在他们这样做之前了解幕后发生的事情。
这些抽象是不是离金属太远了?他们是在帮助还是伤害程序员?
【问题讨论】:
【参考方案1】:我不认为他们是邪恶的。在窗体上放置控件只是“new Thread()”或“new Timer()”的另一种说法,许多程序员也并不真正理解。
简单的解决方案并不总能满足您的需求,但当它们满足时,使用它们有什么问题?
但是,如果使用拖放是程序员知道如何做事的唯一方式,那这不是一个很好的程序员。
【讨论】:
System.Windows.Forms.Timer 组件的行为与其他 Timer 类不同。程序员在使用它们之前应该知道它们的区别。见msdn.microsoft.com/en-us/magazine/cc164015.aspx。 @Michael:同意。我认为这就是 Kristopher 的最后一点。如果您使用 S.W.F.Timer 是因为它既方便又符合您的需求,那很好;如果你在它明显不适用的时候使用它,因为它就是你所知道的,然后放下鼠标并阅读一些 MSDN。【参考方案2】:我认为他们正在伤害程序员。拖放不是编程。
我可能会用大笔画笔,但我发现大多数 Web 应用程序开发人员(特别是 .NET WebForm 开发人员)在涉及 HTTP 模型时完全缺乏知识,这让我感到震惊,比如因为 POST 和 GET 由于它们遇到的抽象而无法掌握。
This article 读起来很有趣,完全反映了我的观点。
【讨论】:
拖放确实不是编程,但在获得工作代码之前不必学习内部原理是可以的。例如,我认为 Visual Studio 设计器对程序员隐藏一些细节的方式是一件好事。无论如何,您最终都必须学习它们。【参考方案3】:就我个人而言,我没有理由在我的职业生涯中使用多线程编程,尽管我确实在大学学习过。因此,Timer 控件对我特别有帮助因为我不想学习如何在 .NET 中进行多线程编程,只是为了获得一些简单的功能。
【讨论】:
++ 这一定是反对拖放线程的最佳论据。 这里的关键词是简单功能。如果我做的事情比运行快速的“从某个表中选择计数(*)”更复杂,那么我会花时间真正学习它。【参考方案4】:“Drag 'n Drop”意味着使用 IDE 的 WYSIWYG 部分?
我是在 VB6 和 Dreamweaver 代码中长大的,所以如果是这样的话,我会选择“非常好”。
【讨论】:
【参考方案5】:BackgroundWorker 增加了真正的价值。它生成的代码(通过使用事件模型)比通过使用委托调用手动执行线程,然后通过 Control.Invoke 将结果编组回 UI 线程来生成更简洁的代码。
我在没有测试 Control.IsHandleCreated 的情况下测试 Control.InvokeRequired 已经被烧死了。当代码已经在 UI 线程上执行并且控件不存在时,Control.InvokeRequired 将返回 false。如果我使用 BackgroudWorker,我可能不会遇到这个问题。
【讨论】:
你说得对,BackgroundWorker 使得在表单中生成和重新加入工作线程变得非常容易。然而,程序员将其用作理解线程工作原理的拐杖是危险的。【参考方案6】:(从问题上的 .Net 标记来看,我假设我们在谈论拖放控件时谈论的是 Visual Studio 设计人员。)
我不认为它们是邪恶的,尽管我同意它并不总是最适合组件(如线程)的隐喻。
对我来说,拖放控件并不是“这是一个远离金属的 UI 组件”的声明。相反,这是一个声明,我“希望设计师为我管理这个组件的生命周期”。从这个角度来看,通过拖放添加诸如后台工作者之类的东西是非常明智的。事实上,这是我最喜欢的将任何 IDisposable 对象包含为(例如)UserControl 或 Form 的成员的方法。这样,代码生成器就为我处理好了,我可以更多地关注我的代码做什么,而不是布线。
【讨论】:
【参考方案7】:我认为对于基本的长时间运行的操作;或一种情况,后台工作人员控制非常适合这些情况。如果您正在做比这更高级的事情,那么您应该研究线程和多线程设计的高级用途。
因此,要想快速启动并运行线程,这并没有什么坏处;但是将其用作执行线程的唯一方法,那肯定会伤害程序员。
【讨论】:
【参考方案8】:这是一个 UI 隐喻。
你拖放的东西应该是一个“东西”,一个文件、文档或任何东西到另一个“东西”一个容器、垃圾箱、碎纸机、打印机或其他东西。
将线程/任务拖放到计时器会失去基本的隐喻,感觉不对。
右键单击和下拉对于“开始计时器”之类的“动词”要好得多。
【讨论】:
【参考方案9】:好消息是,由于 .NET,拖放控件不需要使用拖放样式。我个人认为,虽然拖放对于原型设计来说是可以的,但您的要求越复杂,您就越有可能发现设计师的限制和阻碍。一个简单的例子是当您调整包含窗口大小时应该扩展的表单。您很快就会发现自己编写了如此多的代码,以致于完全放弃设计器会更好。
那是在我们讨论设计器中的错误之前,例如,删除所有事件......
【讨论】:
以上是关于拖放控制 - 邪恶?的主要内容,如果未能解决你的问题,请参考以下文章