对我来说,为方法做出方便的重载是很常见的.这是我可能会做的一个例子:
public void Encode(string value) {
Encode(value, DefaultEncoding);
}
public void Encode(string value, Encoding encoding) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我开始更加关注单元测试,这样的测试方法引入了一些障碍,我不确定我是否相信自己单独进行测试.第一个也是最重要的问题是我是否应该重复两个重载的测试.例如,如果value为null ,则两个方法都应该抛出ArgumentNullException ; 是否更正确地认识到可能存在不同的逻辑并编写两个测试,或者更好地假设方便过载没有自己的逻辑?
我也遇到了次要问题.我的命名方案与Roy Osherove的相同:"MemberName_State_ExpectedResult".如果我复制测试,那么我会在没有引入一些古怪的命名约定的情况下发生冲突.如果复制测试,你如何处理?
我几乎可以肯定我知道这个问题的答案,但我希望有一些我忽略的东西.
某些应用程序似乎在其标题栏和按钮上具有Vista Aero外观和感觉,即使在Windows XP上运行也是如此.(谷歌浏览器和Windows Live照片库作为例子浮现在脑海中.)我知道从WinForms实现这一目标的一种方法是创建一个无边框表单并自己绘制标题栏/按钮,然后重写WndProc以确保移动,调整大小,和按钮点击做了他们应该做的事情(我不清楚具体细节,但可能会花一天时间阅读文档.)我很好奇,如果有一个不同的,更容易的方式,我忽略.也许我忽略了一些API调用或窗口样式?
我相信Google已经通过Chrome使用自己动手操作的方法为我解答了这个问题.如果有人有新信息,我会将问题留待另一天,但我相信我已经自己回答了这个问题.
Windows窗体允许您开发可以拥有设计器的组件,非可视元素.内置组件包括BackgroundWorker,Timer和许多ADO .NET对象.这是一种提供简单配置复杂对象的好方法,它可以实现设计人员辅助的数据绑定.
我一直在看WPF,它似乎没有任何组件的概念.我这是对的吗?是否有一些创建我错过的组件(或类似组件)的方法?
我已经接受了鲍勃的回答,因为经过大量的研究后,我觉得花哨的Adorners可能是唯一的方法.
我正在研究使用log4net,我发现IObjectRenderer接口很有趣.它将允许我们控制类型的记录方式,并提供不同的,可能更加用户友好的ToString()实现.我刚刚开始查看log4net,似乎找不到以编程方式设置类型和渲染器之间关联的逻辑方法.
我发现这可以通过阅读手册在XML配置文件中设置,但它没有给我任何关于以编程方式添加这些内容的提示.在我看来,在某些情况下你宁愿使用程序化对象渲染器,所以我很好奇如何做到这一点.
我在拇指驱动器上使用MediaWiki实例来跟踪大量内容.在过去,我一直很匆忙,所以我没有机会寻找一个很好的制作表的方法,所以这个语法很好地满足了我的目的:
{| border=1
...
|}
Run Code Online (Sandbox Code Playgroud)
现在我想要一些更好的东西; 我习惯使用CSS来制作更好的表格边框,但我找不到通过MediaWiki做这种语法的简洁方法.基本上,我想要一个看起来与这个HTML相同的表:
<table style="border-collapse: collapse">
<tr>
<td style="border: 1px solid black">one</td>
<td style="border: 1px solid black">two</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
在每个单元格上设置边框将很困难.我最初的猜测是我需要在某个地方为CSS文件添加一个表类; 如果是的话,可以在哪里找到合适的文件?
其余问题的更短版本:我遇到了问题,而IoC容器是一个工具.问题听起来像是IoC可以解决的问题,但我还没有阅读足够的工具说明以确定.我很好奇,如果我选错了工具或说明书的哪一章我可以跳过去寻求帮助.
我在Windows窗体控件库上工作.在过去的一年里,我偶然发现了单元测试,并对提高自动化测试的质量充满热情.测试控制很困难,并且在线没有太多关于它的信息.其中一个令人讨厌的事情是交互逻辑与UI胶水的分离,它调用它导致每个控件具有比我通常认为对于类健康更多的依赖性.在测试它们与控件的集成时为这些元素创建假货非常繁琐,我正在研究IoC的解决方案.
有一个障碍我不确定如何克服.要设置容器,您需要有一些在应用程序其余部分之前运行的引导程序代码.在一个应用程序中,这个东西有一个非常明确的地方.在图书馆,它不是那么清楚.
想到的第一个解决方案是创建一个类,该类提供容器的静态实例,并在其类型初始值设定项中设置容器.这适用于运行时,但在测试环境中,我不确定它的效果如何.允许测试并行运行,许多测试需要不同的依赖关系,因此静态共享状态将是一场噩梦.这让我相信容器创建应该是一个实例方法,但是我有一个鸡和蛋问题,因为控件必须在它创建自己之前构造它的容器.想到控件的类型初始值设定项,但我的测试将无法修改此行为.这让我想到使容器本身成为控件的依赖,其中用户可见的构造函数提供运行时默认实现,但是这要由我的测试来设置自己的容器.我没有考虑过这个问题,但似乎这与我现在的工作水平相同:每次测试必须初始化3-5个依赖项的测试.
通常情况下,我会自己尝试很多东西,看看有什么疼.我目前处于严格的期限之下,所以在编写代码时我没有太多时间进行实验; 我只是在短暂的时间内思考这个问题并且没有太多的论文.我确定其他人也遇到过类似的问题,所以如果我不需要重新发明轮子那就太好了.
还有其他人攻击过这个问题吗?是否有一些战略可以满足这些需求?由于我的经验不足,我只是一个新手和过于复杂的事情吗?如果是后者,我会喜欢你想分享的任何资源来解决我的无知.
更新:
我想回应Mark Seeman的回答,但它需要比评论字段允许的更多字符.
我已经玩弄了演示模型模式.在这种情况下,视图是公共控件类,每个视图都有一个或多个控制器类.当在控件上触发某个UI事件时,它执行的唯一逻辑是决定需要调用哪些控制器方法.
探索这种设计的简短表达是我的控制器类与它们的视图紧密耦合.根据DI容器使用松散耦合代码的说法,我正在阅读"错误的工作工具".我可能能够设计一个更松散耦合的架构,此时DI容器可能更容易使用.但这需要一些重大的努力,而且需要对已发布的代码进行大修; 我会不得不尝试新的东西,然后匆匆走近旧的东西.这是另一天的问题.
为什么我甚至想要注入强耦合类型而不是使用本地默认值?一些接缝旨在成为高级用户的可扩展点.我必须测试涉及不正确实现的各种场景,并验证我是否符合我的合同; 模拟对象非常适合.
对于目前的设计,克里斯巴拉德关于"穷人的DI"的建议是我或多或少关注的,对于我的强耦合类型,这只是很多繁琐的设置.我有这个愿景,我能够将所有这些乏味的东西推到一些DI容器设置方法中,但是我越努力证明这种方法,我就越相信我会变成我试图用大锤挂图片.
我会等待24小时左右,看看在接受之前是否进一步讨论.
前几天,在代码审查中,我看到了一些关于从工作线程设置属性的安全性的问题.一位同事发表了评论,"此属性绑定到UI,数据绑定是线程安全的."
我一直在使用XF,但总是认为这不是真的:如果我想更新绑定到UI的ViewModel属性,我必须在UI线程上进行这些更改.我只花了几分钟探索文档,除了直接操作BindableProperties具有线程关联性之外,我没有看到明显的答案.如果那是阻止UI线程执行,那对我来说也很重要.
我可以制作一个项目来自己测试,但这些问题似乎总是间歇性的,所以我想知道我只是错过了正确的文档.
(这与调查崩溃有关,我们看到主要发生在Xamarin调用堆栈中.我们从工作线程引发事件,VM处理该事件并更新一些属性.如果这是为UI线程安排的,可能会有我们没有准备好一些交错问题,而且我更接近于解决崩溃问题.如果它没有安排用于UI线程......我很惊讶它的工作时间很长.)
据我所知,Command模式的目标是帮助将UI交互与应用程序逻辑分开.使用正确实现的命令,单击"打印"菜单项可能会产生一系列交互,如下所示:
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
Run Code Online (Sandbox Code Playgroud)
这鼓励您将UI与应用程序逻辑分开.
我一直在研究WPF命令,在大多数情况下,我看到他们是如何实现这种模式的.但是,我觉得在某种程度上它们使命令模式变得复杂,并设法以不鼓励将UI与应用程序逻辑分离的方式实现它.
例如,考虑这个简单的WPF窗口,它有一个按钮将文本粘贴到文本框中:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox x:Name="txtData" />
<Button Command="Paste" Content="Paste" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是代码隐藏:
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从命令中获得了什么?在我看来,我可以轻松地将命令绑定事件处理程序中的代码放入按钮的Click事件中.当然,现在我可以将多个UI元素与粘贴命令相关联,我只需要使用一个事件处理程序,但是如果我想粘贴到几个不同的文本框呢?我必须使事件处理程序逻辑更复杂或编写更多的事件处理程序.所以现在,我觉得我有这个:
(button) ---executes Routed Command---> (Window) ---executes command …Run Code Online (Sandbox Code Playgroud) (我最初在Xamarin论坛上发布了这个,但后来我决定在这里得到更快的答案?)TL; DR:有些布局会计算透明背景上的点击,其他布局则不会.在容器上设置InputTransparent为其所有子项设置它,我觉得孩子应该能够覆盖父项.我需要创建覆盖另一个元素的元素,并通过透明区域传递水龙头,但仍然有可点击的按钮.当我尝试使用网格时,它不起作用.我不想回到AbsoluteLayouts.我现在主要在iOS工作,我不太确定它是不是Android的问题.Windows Phone/UWP不在桌面上.
更长的版本:
我正在重写一些在较旧的Xamarin Forms(我认为1.3)中运行正常的布局.我们最近升级到2.1,它对布局代码的错误决定造成了严重破坏.我的任务是更新布局以表现自己.虽然我认识2.2已经发布,但我只是尝试升级,我输入的所有内容在该版本中也是如此,所以它不是2.1和2.2的问题,或者至少如果做了一些改进他们没有帮助我.
它是一个地图应用程序,因此所有布局的核心都是昂贵的,不稳定的OpenGL元素.这个元素非常不喜欢被重新定义,所以我采用了类似于这个虚构的XAML的布局:
<ContentPage>
<CustomLayout>
<OurHeaderControl />
<TheMapControl />
<OurFooterControl />
<MapOverlay />
</CustomLayout>
</ContentPage
Run Code Online (Sandbox Code Playgroud)
"MapOverlay"的目的是通过在页眉/页脚区域和/或地图上添加Xamarin元素来实现我们的工作流程.例如,一个布局会在页脚上方的底部添加一个方向列表,因此它显示的地图空间较小.自定义布局理解这一点并在叠加后布局地图,以便它可以请求正确的地图边界.
在这种布局中,我无法点击MapOverlay结束的任何内容.我可以把它变成InputTransparent并点击那些东西,但是它的所有子节点也都是不可点击的.在旧版面中不是这样.
这是我在旧布局和新布局之间看到的唯一区别:
旧的布局是AbsoluteLayouts的一个复杂的混乱.它看起来像这样,我没写它:
<ContentPage>
<AbsoluteLayout> // "main layout"
<AbsoluteLayout> // "map layout"
<Map /> // An AbsoluteLayout containing the OpenGL view.
</AbsoluteLayout>
<AbsoluteLayout> // "child layout"
<SubPage /> // An AbsoluteLayout
</AbsoluteLayout>
</AbsoluteLayout>
</ContentPage>
Run Code Online (Sandbox Code Playgroud)
主布局包含AbsoluteLayouts以约束子视图.一个子视图本身就是一个AbsoluteLayout,它包含Map和一些与之关联的其他元素.另一个子项是叠加层,它始终是一个AbsoluteLayout,其中包含与该叠加层相关的元素.这些布局都以周期相互引用,并在布局事件发生变化时相互更新.这是一个迷人的乒乓球,最终落户.通常.有时候事情就会消失.显然我有一个改写它的原因.
但我可以点击我需要在每一层点击的内容,但我没有得到.
所以,让我们谈谈我需要做些什么,也许可以弄清楚它是否是一个错误,为什么它不起作用,或者它是否与其他布局一起使用是巧合.这是一个非XAML页面布局,演示了我的项目源于你不能在共享库中使用XAML的日子:
我需要能够点击此UI中的两个按钮并让它们做出响应.
public class MyPage : ContentPage {
public MyPage() {
var mainLayout = new AbsoluteLayout();
// Two buttons will be overlaid.
var overlaidButton …Run Code Online (Sandbox Code Playgroud) 我正在处理少数 Xamarin Forms 项目和生成多目标 Xamarin 包的项目。我花了一天的时间努力让其中一个项目在 Azure DevOps 中正常运行,但我放弃了。
当我在本地处理一个特定的单元测试项目时,它会设置以下目录结构:
+ ProjectName
+ bin
+ obj
+ ...
+ packages
+ <nuget packages here>
Run Code Online (Sandbox Code Playgroud)
这种结构在项目文件的部分中表现出来,如下所示:
<Import Project="..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" />
Run Code Online (Sandbox Code Playgroud)
项目文件的另一部分取决于此:
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
</Target>
Run Code Online (Sandbox Code Playgroud)
当我在本地构建它时,一切都很好。项目建立。测试通过。当我在 Azure …
.net ×2
c# ×2
winforms ×2
wpf ×2
azure-devops ×1
components ×1
log4net ×1
mediawiki ×1
mvvm ×1
nuget ×1
overloading ×1
testing ×1
unit-testing ×1
windows-xp ×1