我有一个方法,需要30个参数.我把参数放到一个类中,这样我就可以将一个参数(类)传递给方法.在重构传递一个封装所有参数的对象的情况下是否完全正常,即使它包含所有参数.
今天调试一些Web服务客户端代码时(在Java中,使用jax-ws),我遇到了令人兴奋的97个参数的Web服务方法!
我必须创建一个调用此方法的测试用例,我注意到了几件事:
所以这让我思考,您认为方法的最大参数数量是多少?如果您可以更改此Web服务签名,您认为如何改进它?
我有一个类,需要将12个参数传递给它的构造函数.所以我认为这个类的设计有问题.
我想询问是否有任何关于类设计的设计模式或一般规则集合,特别是它的构造函数.
我有一个Angular应用程序.它的工作正常,但随着我的应用程序越来越大,我担心每个控制器都需要注入大量的依赖项.
例如
app.controller('viewapps',[
'$scope','Appfactory','Menu','$timeout','filterFilter','Notice', '$routeParams',
function($scope,Appfactory,Menu,$timeout,filterFilter,Notice,$routeParams) {
//controller code..
}])
Run Code Online (Sandbox Code Playgroud)
我确信将来会依赖列表.我在这里做错了吗?这是正确的方法吗?有效处理这个问题的最佳方法是什么?
可能重复:
有多少参数太多了?
我只是写了一个带有几个值的函数,它让我思考.函数/方法的参数的数量是多少?什么时候(如果)它表示有缺陷的设计?你设计/重构函数来接受结构,数组,指针等来减少参数的数量吗?你是否为了减少参数的数量而重构数据?不过,似乎这在OOP设计中可能稍微适用一些.只是好奇看别人如何看待这个问题.
编辑:作为参考,我刚写的函数采用了5个参数.我使用了我的AP Econ老师给我的几个定义.超过2; 少于7.
你如何修复以下传递过多参数的错误代码?
void helper1(int p1, int p3, int p5, int p7, int p9, int p10) {
// ...
}
void helper2(int p1, int p2, int p3, int p5, int p6, int p7, int p9, int p10) {
// ...
}
void foo(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
int p9, int p10) {
helper1(p1, p3, p5, p7, p9, p10);
helper2(p1, p2, p3, p5, p6, p7, p9, p10);
}
Run Code Online (Sandbox Code Playgroud)
我看到两种不同的方法:
方法1:将所有函数放在一个类中
class Foo …
Run Code Online (Sandbox Code Playgroud) 我在StackOverflow上遇到了以下问题:有多少参数太多了?
这让我想到,JS函数的参数数量是否存在实际限制?
test(65536); // okay
test(65537); // too many
function test(n) {
try {
new Function(args(n), "return 42");
alert(n + " parameters are okay.");
} catch (e) {
console.log(e);
alert(n + " parameters are too many.");
}
}
function args(n) {
var result = new Array(n);
for (var i = 0; i < n; i++)
result[i] = "x" + i;
return result.join(",");
}
Run Code Online (Sandbox Code Playgroud)
事实证明,JavaScript在函数上强加了65536个参数的实际限制.
但是,有趣的是错误消息说限制是65535参数:
SyntaxError: Too many parameters in function definition (only 65535 allowed)
Run Code Online (Sandbox Code Playgroud)
所以,我有两个问题:
我一直在通过Amazon Java SDK使用Amazon Glacier.
我很惊讶参数是通过一个对象传递的,而不是作为单独的参数传递的.
例如,要检索作业的输出,其中参数是Vault,JobId,range,则使用以下技术:
client.getJobOutput(new GetJobOutputRequest(Vault, JobId, range));
Run Code Online (Sandbox Code Playgroud)
代替:
client.getJobOutput(Vault, JobId, range);
Run Code Online (Sandbox Code Playgroud)
这两种方法的优点和缺点是什么?
我与一位同事讨论了使用代码合同来执行先决条件检查.
假设我们有以下代码:
namespace Project
{
using System;
using System.Diagnostics.Contracts;
public class Thing
{
public string Foo { get; set; }
public int Bar { get; set; }
}
public class ThingsManipulator
{
public void AddThing(Thing thing)
{
Contract.Requires<ArgumentNullException>(thing != null);
// Do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果// Do something
我正在访问thing.Foo
和thing.Bar
执行操作,我是否应该通过代码合同验证它们?
public void AddThing(Thing thing)
{
Contract.Requires<ArgumentNullException>(thing != null);
Contract.Requires<ArgumentException>(!string.IsNullOrWhiteSpace(thing.Foo));
Contract.Requires<ArgumentException>(thing.Bar > 0);
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我的同事说只应检查整个参数(即我们应该只放置第一个合同),我认为方法应检查它们使用的是什么,无论它是整个参数还是其中一个属性(即我们应该全部三个合同).
请注意,我理解并同意,如果参数的属性应始终满足要求,则该要求应放在对象的不变检查中.
我所指的是通常有效的值,但对于特定方法无效(例如,在上面的示例中thing.Bar
可能很乐意保留负值,但AddThing
不喜欢它们).
我的同事说在这些情况下,方法签名应该显示它使用的所有项目而不是单个对象(例如AddThing(string …
我尝试调用以下过程时收到错误:
ApplyVoucherNumberToBillingCharges(practiceID,
Convert.ToInt32(rdoVoucherNumberAppliesTo.SelectedValue),
VoucherNumber,
VoucherNumberID,
Convert.ToInt32(hdRoundingRecordId.Value),
ChargeID,
hdGenerateVoucherNumberChargeList.Value,
Convert.ToDateTime(txtFromDate.Text),
Convert.ToDateTime(txtToDate.Text),
Convert.ToDateTime(txtPostingDate.Text),
Convert.ToInt32(ddlVisitType.SelectedValue),
SelectVisitProvider.SelectedID,
SelectVisitLocation.SelectedID,
chkOverwriteVoucherNumber.Checked);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
输入字符串格式不正确c#
我知道这与转换类有关,因为我之前调用不同的方法时遇到了同样的错误.区别在于只有一个参数使用Convert类,现在有几个参数.
错误信息并不像我想的那样具有描述性,也没有提供许多关于特定情况发生的线索.
除了对每个执行此操作的参数进行注释和硬编码以及查看哪个参数导致问题之外,还有更好的方法来确定问题是什么吗?
我真的很想知道,因为我的项目有时需要几分钟才能构建(我知道,这很荒谬,我已经尝试了一切来解决这个问题,但没有任何作用)所以调试这个小问题可能需要永远.
感谢您的任何帮助,您可以提供.
parameters ×6
c# ×3
c++ ×2
refactoring ×2
.net ×1
angularjs ×1
class-design ×1
constructor ×1
debugging ×1
ecmascript-5 ×1
ecmascript-6 ×1
function ×1
ide ×1
java ×1
javascript ×1
oop ×1
standards ×1