Is it not possible to extract a function from code in MATLAB?
2 次查看(过去 30 天)
显示 更早的评论
It would improve my productivity if I could reafactor code into functions automatically. So I want to do this in MATLAB:
void printOwing() {
printBanner();
//print details
System.out.println ("name: " + _name);
System.out.println ("amount " + getOutstanding());
}
|||
|||
vvv
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails (double outstanding) {
System.out.println ("name: " + _name);
System.out.println ("amount " + outstanding);
}
0 个评论
回答(6 个)
Steven Lord
2023-9-27
The Release Notes indicate the ability to automatically convert selected code into a function was introduced in release R2021b.
1 个评论
Luciano Branco
2023-9-27
Omg, amazing! I will try this ASAP.
Is there way to add a hotkey for this or just clicking on the Refactor button?
Geoff Hayes
2016-6-5
Martin - I suspect that it is possible for you to write a MATLAB script that will refactor your Java code so long as you define a clear set of rules. From the above (simple) example, it appears that your MATLAB script would look for comments and convert them to to a function. But would this always be true? Would all comments be automatically turned into functions? At what point would the script stop building the function? When the next comment is reached or the end of the current function?
And in this case, how should the script know that getOutstanding() should be the input parameter to your function and that the input to printDetails should be a double (presumably because that is what getOutstanding returns)? So you will somehow need to keep track of the functions defined in your class (or whatever) file so that you can then use that information elsewhere...
You may want to look at other refactoring tools before starting to write your own MATLAB script to do the same.
0 个评论
Walter Roberson
2016-6-5
I would not recommend using MATLAB for this task. I would recommend using a tool optimized for text processing, such as Perl. Or a lot of people like Python for text tasks.
0 个评论
Martin
2016-6-5
2 个评论
Walter Roberson
2016-6-5
So do I understand correctly, you would like to be able to highlight a block of MATLAB code, and have a function automatically generated from it? And the inputs to the function should be all the variables whose value is not defined in the code before first use, and the outputs should be all of the variables assigned to in the code (which might include some of the inputs)?
Would it be necessary to analyze to detect cases where humans can see that a variable would be defined before first use, but where it is not "obvious" that is the case? For example,
for K = 1 : 20
if K == 1
flag = false;
end
flag = ~flag;
end
Here, flag does not need to be an input but a code analysis tool would need to prove that the test that applies to it would definitely be satisfied before use; for example,
for K = 1 : 20
if sqrt(K) == K
flag = false;
end
flag = ~flag;
end
Humans know through mathematical reasoning that on the first iteration, sqrt(1) == 1 so the assignment would happen, but would the code generator be required to do that analysis?
How about
for K = 1 : 20
if cos(pi*K/2) == 0
flag = false;
end
flag = ~flag;
end
Mathematical reasoning tells us that for the first iteration that is cos(pi/2) which we "know" to be 0 so we think the assignment should happen on the first iteration. But in MATLAB, cos(pi/2) is 6.12323399573676603586882014729198302312846062338790031898128063403419218957424163818359375e-17 not 0, because pi is the finite-length truncation of the infinite irrational Pi. It follows from this that to an accurate assessment, the program would need to be emulated to figure out what it does... Oh and suppose the passed-in datatype turns out not to be the expected one?
a j
2017-11-3
Hi Walter,
I do agree, there are some difficult cases for extracting functions in Matlab. And maybe the example above is not the best since it deals with text instead of math. However, having worked a lot with good Java IDEs (e.g. IntelliJ, Eclipse) the "refactor -> extract method" function is the thing that i miss often in matlab. It can save a lot of headache.
Just my five cents to support the cause.
Matthias SImons
2021-6-24
I cannot believe that Matlab has no functionality for this in 2021! I had to use Matlab again after having used Python a lot in the last few years, and I was just stumped that this is missing.
0 个评论
Luciano Branco
2023-9-27
Another day passes and I'm still baffled Matlab doesn't have this functionality...
I get there are difficult edge cases to determine which variables should be input and which can be declared inside the new function. But we can just pass every variable used and not deal with these edge cases @Walter Roberson was mentioning.
- You select a segment of code, press a hotkey combination and it copies that to a new function at the end of your code.
- A small GUI asks for function name, maybe confirms variables being 'ported'.
- It caries the variables you selected and return what the original context needed.
In the original example @Martin provided, it would just take '_name' and 'outstanding' as variables and return nothing.
I'm not too familiar with automating Matlab with things like this but if someone points me in the direction I can give it shot.
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!