我希望能够在IntelliJ IDEA中将实例方法从一个类移动到另一个类(来自Fowler的"重构"中的"Move方法").不幸的是,当我尝试"Move ..."(cmd:F6)时,它告诉我"没有方法有引用类型.你想让方法静态然后移动吗?" 我不想让我的方法静态,我希望它是另一个类的实例方法.
我的代码示例:
public class TheClass {
public void doStuff(){
int i = themethod();
}
private int theMethod() {
System.out.println( "Hello World!" );
return 0;
}
}
public class OtherClass {
}
Run Code Online (Sandbox Code Playgroud)
说我想移动theMethod从TheClass到OtherClass.在IDEA中是否有自动重构,如果是这样的话:我该如何应用它?
有没有办法将可执行块作为参数传递给静态方法?有可能吗?例如,我有这种方法
public static void someMethod(boolean flag, Block block1, BLock block2) {
//some other code
if(flag)
block1.execute();
else block2.execute();
//some other code
}
Run Code Online (Sandbox Code Playgroud)
或类似的东西.它实际上比这更复杂,我只是简化了问题.我正在尝试重构我的项目,我创建了一个包含我的类使用的静态方法的通用实用程序类.
我目前正在处理一段代码,其中逻辑和数据访问都存在于GUI类中.显然,我想改善这种情况.
目前的结构基本上是:
最终目标是实现类似DDD的结构:
那么,你会如何解决这个问题呢?
通常,类构造函数应该接受的参数的最大数量是多少?我正在开发一个需要大量初始化数据的类(目前有10个参数).但是,具有10个参数的构造函数感觉不对.这让我相信我应该为每个数据创建一个getter/setter.不幸的是,getter/setter模式不会强制用户输入数据,没有它,对象的表征就不完整,因此无用.思考?
我有一个模式,重复几个成员函数,如下所示:
int myClass::abstract_one(int sig1)
{
try {
return _original->abstract_one(sig1);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
bool myClass::abstract_two(int sig2)
{
try {
return _original->abstract_two(sig2);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
[...]
int myClass::abstract_n(bool sig3a, short sig3b)
{
try {
return _original->abstract_n(sig3a, sig3b);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
Run Code Online (Sandbox Code Playgroud)
其中抽象一个到n是纯虚拟抽象接口用于其的方法myClass和_original是具体实现.
我不喜欢这个模式在代码中重复,并希望找到一种方法来消除重复try/ catch模式和代码作为单个抽象,但我想不出一个在没有宏的情况下在C++中执行此操作的好方法.我认为有一种方法可以让模板更好地完成这项工作.
请建议一种简洁的方法来重构此代码以抽象出重复的模式.
Eclipse警告我正在使用不推荐使用的方法:
eventDay = event.getEvent_s_date().getDate();
Run Code Online (Sandbox Code Playgroud)
所以我把它改写成了
eventDay = DateUtil.toCalendar(event.getEvent_s_date()).get(Calendar.DATE);
Run Code Online (Sandbox Code Playgroud)
它似乎工作,但它看起来很难看.我的问题是我是否以最好的方式重构了这个?如果没有,你会如何重构?我需要存储在bean中的日期的日期编号.
我最终在我的DateUtils中添加了一个方法来清理它
eventDay = DateUtil.getIntDate(event.getEvent_s_date());
public static int getIntDate(Date date) {
return DateUtil.toCalendar(date).get(Calendar.DATE);
}
Run Code Online (Sandbox Code Playgroud) 我知道我可以在Eclipse源代码菜单中为字段生成setter和getter,但我很惊讶它不提供用新调用方法调用来替换直接字段访问器.
有谁知道如何做到这一点,手动搜索和替换?
谢谢!
" 特征分支 " 是指每个特征在其自己的分支中开发,并且仅在经过测试并准备发运时才合并到主线中.这允许产品所有者选择进入给定货件的功能以及如果更重要的工作进入而部分写入的"停放"功能(例如,客户打电话给MD进行投诉).
" 重构 "正在改变代码以改进其设计,从而降低变更成本.如果不继续这样做,你往往会得到更难以编写测试的代码库.
在现实生活中,总会有客户销售新功能,并且由于政治原因,所有客户都必须看到"他们的"功能组正在取得进展.因此很少有时间没有很多半成品功能坐在树枝上.
如果已经进行了任何重构,那么"特征分支"中的合并变得更加困难,如果不是不可能的话.
我们只是不得不放弃能够进行任何重构吗?
另请参阅" 如何处理重构与合并需求之间的紧张关系?"
Resharper推荐这些vars:
List<string> senderDeviceIDList;
string senderDeviceID;
. . .
foreach (var item in PlatypiIds)
{
senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
senderDeviceID = senderDeviceIDList[0];
Run Code Online (Sandbox Code Playgroud)
...可以在内部范围内声明,如下所示:
foreach (var item in PlatypiIds)
{
List<string> senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
string senderDeviceID = senderDeviceIDList[0];
Run Code Online (Sandbox Code Playgroud)
......但那真的"更好"吗?这不会导致变量被声明N次(每个foreach循环一次)吗?
refactoring ×10
java ×4
c# ×2
branch ×1
c++ ×1
code-design ×1
coding-style ×1
date ×1
eclipse ×1
eclipse-jdt ×1
exception ×1
legacy ×1
resharper ×1
scope ×1
templates ×1
vb.net ×1