Refining Uncle Bob’s Clean Code(四)

本文详细介绍了Java中参数解析的实现方式,并通过ArgumentPopulator类展示了如何便捷地将当前参数传递给各类ArgumentMarshaler实例。通过具体代码示例,深入探讨了参数类型检查、参数获取与设置等关键步骤。

And another one …

01 import java.util.regex.Pattern;
02 import com.mgi.util.args.ArgsException.ErrorCode;
03  
04 public class IntegerArgumentMarshaler extends AbstractArgumentMarshaler {
05  
06     private static final Pattern ARGUMENT_ID_PATTERN = Pattern.compile( "[a-z]" );
07     private static final String ARGUMENT_TYPE_POSTFIX = "#";
08  
09     private int intValue = 0;
10  
11     private IntegerArgumentMarshaler( String argumentId ){
12         super( argumentId );
13     }
14  
15     protected IntegerArgumentMarshaler(){
16         thisnull );
17     }
18  
19     @Override
20     public ArgumentMarshaler newInstance(String argumentId) {
21         return new IntegerArgumentMarshaler( argumentId );
22     }
23  
24     @Override
25     public String getArgumentTypePostfix() {
26         return ARGUMENT_TYPE_POSTFIX;
27     }
28  
29     @Override
30     public Pattern getArgumentIdPattern() {
31         return ARGUMENT_ID_PATTERN;
32     }
33  
34     @Override
35     public int getNumberOfArgs() {
36         return 1;
37     }
38  
39     public void set(String... arguments) throws ArgsException {
40  
41         if( arguments.length == 0 || arguments[0] == null ){
42             throw new ArgsException( ErrorCode.MISSING_INTEGER, getArgumentId(), null );
43         }
44  
45         try {
46             intValue = Integer.parseInt(arguments[0]);
47         }
48         catch (NumberFormatException e) {
49             throw new ArgsException( ErrorCode.INVALID_INTEGER, getArgumentId(), arguments[0] );
50         }
51     }
52  
53     public Object get() {
54       return intValue;
55     }
56   }

I think you can see that implementing a new ArgumentMarshaler is not more complicated as before. Just answer some more questions about it’s context – the main part remains quite the same.

Give it to me, Baby …

Now that we know how a single Marshaler works and how we can retrieve them from our Marshalers collection, it’s very easy to pass the current arguments to them. As said before, we just shifted that task into a class of its own – ArgumentPopulator:

01 import java.util.Iterator;
02 import java.util.List;
03  
04 public class ArgumentPopulator {
05  
06     private List<String> argsList = null;
07  
08     public static ArgumentPopulator distribute( List<String> argsList ){
09         return new ArgumentPopulator( argsList );
10     }
11  
12     private ArgumentPopulator( List<String> argsList ){
13         this.argsList = argsList;
14     }
15  
16     public void to( Marshalers marshalers ) throws ArgsException{
17  
18         for ( Iterator<String> arguments = argsList.iterator(); arguments.hasNext(); ) {
19  
20             String argument = arguments.next();
21  
22             if ( representsArgumentId( argument ) ){
23  
24                 String argumentId = extractArgumentIdFrom( argument );
25  
26                 if( ! marshalers.isMarshalerAvailabeFor( argumentId ) ){
27                     throw new ArgsException( ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, argumentId, null);
28                 }
29  
30                 ArgumentMarshaler marshaler = marshallers.getMarshalerFor( argumentId );                           
31  
32                 marshaler.set( getArgumentsAhead( marshaller.getNumberOfArgs(), arguments ) );
33             }
34         }
35     }
36  
37     private String extractArgumentIdFrom(String argument) {
38         return argument.substring( 1, argument.length() );
39     }
40  
41     private boolean representsArgumentId(String argument) {
42         return argument.startsWith( "-" );
43     }
44  
45     private String[] getArgumentsAhead( int numberOfArgs, Iterator<String> arguments ) {
46           String[] args = new String[numberOfArgs];
47  
48           forint i=0; i < numberOfArgs; i++ ){
49               args[i] = arguments.hasNext() ? arguments.next() : null;
50           }
51           return args;
52       }
53 }

As you can see, ArgumentPopulator accepts a List of current arguments (by using the provided Factory method distribute()) and tries to push the found arguments to any collection of passed Marshalers (using the to() method).

给定的参考引用中未涉及“Staged Projection Refining Multiple Orthogonal Matching Pursuit Algorithm”的相关信息,因此无法依据引用内容对该算法进行介绍及说明其应用。 一般而言,正交匹配追踪(Orthogonal Matching Pursuit, OMP)算法是一种用于稀疏信号恢复的贪婪算法,它通过迭代地选择与残差最相关的原子来逐步构建稀疏表示。而“Staged Projection Refining Multiple Orthogonal Matching Pursuit Algorithm”可能是在传统OMP算法基础上进行改进和扩展的算法。 从名称推测,“Staged Projection”可能意味着该算法采用分阶段投影的方式,逐步优化投影过程以提高稀疏信号恢复的准确性;“Refining”表示对结果进行精炼,可能是在迭代过程中不断调整和优化已选择的原子;“Multiple”可能表示该算法在每次迭代中会选择多个原子,而不是像传统OMP每次只选一个原子。 该算法可能应用于信号处理、图像处理、机器学习等领域的稀疏信号恢复问题,例如在压缩感知中用于从少量测量值中恢复原始的稀疏信号,在图像去噪、特征提取等方面也可能有应用。 以下是一个简单的传统OMP算法的Python代码示例: ```python import numpy as np def omp(A, y, K): m, n = A.shape r = y.copy() omega = [] x = np.zeros(n) for k in range(K): correlations = np.abs(A.T @ r) idx = np.argmax(correlations) omega.append(idx) A_omega = A[:, omega] x_omega = np.linalg.pinv(A_omega) @ y r = y - A_omega @ x_omega x[omega] = x_omega return x # 示例使用 m = 50 n = 100 K = 10 A = np.random.randn(m, n) x_true = np.zeros(n) x_true[np.random.choice(n, K, replace=False)] = np.random.randn(K) y = A @ x_true x_est = omp(A, y, K) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值