aserg-ufmg / RefDiff

A tool to mine refactorings in the commit history of git repositories.
MIT License
146 stars 44 forks source link

Move Method in Extract Interface #22

Open osmarleandro opened 3 years ago

osmarleandro commented 3 years ago

Summary

In the source code present in osmarleandro/incubator-gobblin@26c45ca commit, I applied a single Extract Interface to the Watermark interface, extracting the IWatermark interface. RefDiff yields a list of refactorings, which includes Extract Interface, Change Signature Method, Move Method, and Pull Up Method.

The Move Method instance points to a method that changes the signature moved to the IWatermark interface, while the Pull Up Method points to a method with the same signature moved to the IWatermark interface. Fowler’s book (2020) shows that the Extract Interface can be followed by Pull Up Method, Pull Up Field, and Change Function Declaration, but it was not mentioned the Move Method.

Considering Fowler's definition and the IWatermark interface was created between the revisions, is the Move Method a valid refactoring transformation?

Code example

Diff fragment between the commit osmarleandro/incubator-gobblin@26c45ca and their parent.

@@ -0,0 +1,24 @@
+public interface IWatermark {
+
+   /**
+      * Convert this {@link Watermark} into a {@link JsonElement}.
+      * @return a {@link JsonElement} representing this {@link Watermark}.
+      */
+   JsonElement toJson();
+
+   /**
+      * This method must return a value from [0, 100]. The value should correspond to a percent completion. Given two
+      * {@link Watermark} values, where the lowWatermark is the starting point, and the highWatermark is the goal, what
+      * is the percent completion of this {@link Watermark}.
+      *
+      * @param lowWatermark is the starting {@link Watermark} for the percent completion calculation. So if this.equals(lowWatermark) is true, this method should return 0.
+      * @param highWatermark is the end value {@link Watermark} for the percent completion calculation. So if this.equals(highWatermark) is true, this method should return 100.
+      * @return a value from [0, 100] representing the percentage completion of this {@link Watermark}.
+      */
+   short calculatePercentCompletion(IWatermark lowWatermark, IWatermark highWatermark);
+
+}

@@ -30,22 +30,5 @@ import com.google.gson.JsonElement;
-public interface Watermark {
-
-  /**
-   * Convert this {@link Watermark} into a {@link JsonElement}.
-   * @return a {@link JsonElement} representing this {@link Watermark}.
-   */
-  public JsonElement toJson();
-
-  /**
-   * This method must return a value from [0, 100]. The value should correspond to a percent completion. Given two
-   * {@link Watermark} values, where the lowWatermark is the starting point, and the highWatermark is the goal, what
-   * is the percent completion of this {@link Watermark}.
-   *
-   * @param lowWatermark is the starting {@link Watermark} for the percent completion calculation. So if this.equals(lowWatermark) is true, this method should return 0.
-   * @param highWatermark is the end value {@link Watermark} for the percent completion calculation. So if this.equals(highWatermark) is true, this method should return 100.
-   * @return a value from [0, 100] representing the percentage completion of this {@link Watermark}.
-   */
-  public short calculatePercentCompletion(Watermark lowWatermark, Watermark highWatermark);
+public interface Watermark extends IWatermark {
 }

Environment details

RefDiff 2.0

Steps to reproduce

  1. Run RefDiff and give as input the commit osmarleandro/incubator-gobblin@26c45ca.

Actual results

CHANGE_SIGNATURE    {Method setActualHighWatermark(Watermark) at gobblin-api/src/main/java/org/apache/gobblin/configuration/WorkUnitState.java:244} {Method setActualHighWatermark(IWatermark) at gobblin-api/src/main/java/org/apache/gobblin/configuration/WorkUnitState.java:245})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/watermark/StringWatermark.java:53}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/watermark/StringWatermark.java:53})
CHANGE_SIGNATURE    {Method new(String, Path, Watermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/replication/WatermarkMetadataGenerationCommitStep.java:47}    {Method new(String, Path, IWatermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/replication/WatermarkMetadataGenerationCommitStep.java:47})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-utility/src/test/java/org/apache/gobblin/util/ParallelRunnerTest.java:283}  {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-utility/src/test/java/org/apache/gobblin/util/ParallelRunnerTest.java:284})
CHANGE_SIGNATURE    {Method new(Watermark, Watermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/WatermarkInterval.java:38}   {Method new(IWatermark, IWatermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/WatermarkInterval.java:38})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-modules/gobblin-kafka-common/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/KafkaStreamingExtractor.java:158}  {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-modules/gobblin-kafka-common/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/KafkaStreamingExtractor.java:158})
CHANGE_SIGNATURE    {Method setActualHighWatermark(Watermark) at gobblin-api/src/main/java/org/apache/gobblin/configuration/ImmutableWorkUnitState.java:44} {Method setActualHighWatermark(IWatermark) at gobblin-api/src/main/java/org/apache/gobblin/configuration/ImmutableWorkUnitState.java:44})
CHANGE_SIGNATURE    {Method convertWatermarkToJson(Watermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/WatermarkSerializerHelper.java:33}   {Method convertWatermarkToJson(IWatermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/WatermarkSerializerHelper.java:33})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-api/src/test/java/org/apache/gobblin/stream/RecordEnvelopeTest.java:270}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-api/src/test/java/org/apache/gobblin/stream/RecordEnvelopeTest.java:270})
CHANGE_SIGNATURE    {Method serialize(Watermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/replication/WatermarkMetadataUtil.java:37}    {Method serialize(IWatermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/copy/replication/WatermarkMetadataUtil.java:38})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-modules/gobblin-kafka-common/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/MultiLongWatermark.java:71}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-modules/gobblin-kafka-common/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/MultiLongWatermark.java:72})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-api/src/test/java/org/apache/gobblin/source/extractor/TestWatermark.java:37}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-api/src/test/java/org/apache/gobblin/source/extractor/TestWatermark.java:37})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-core-base/src/main/java/org/apache/gobblin/source/extractor/extract/LongWatermark.java:59}  {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-core-base/src/main/java/org/apache/gobblin/source/extractor/extract/LongWatermark.java:59})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-modules/gobblin-kafka-09/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/KafkaSimpleStreamingExtractor.java:113}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-modules/gobblin-kafka-09/src/main/java/org/apache/gobblin/source/extractor/extract/kafka/KafkaSimpleStreamingExtractor.java:113})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-core-base/src/main/java/org/apache/gobblin/source/extractor/DefaultCheckpointableWatermark.java:67} {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-core-base/src/main/java/org/apache/gobblin/source/extractor/DefaultCheckpointableWatermark.java:67})
CHANGE_SIGNATURE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/conversion/hive/watermarker/MultiKeyValueLongWatermark.java:59}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-data-management/src/main/java/org/apache/gobblin/data/management/conversion/hive/watermarker/MultiKeyValueLongWatermark.java:60})

EXTRACT_SUPER   {Interface Watermark at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/Watermark.java:22}    {Interface IWatermark at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/IWatermark.java:5})
MOVE    {Method calculatePercentCompletion(Watermark, Watermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/Watermark.java:41}    {Method calculatePercentCompletion(IWatermark, IWatermark) at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/IWatermark.java:13})
PULL_UP {Method toJson() at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/Watermark.java:35}    {Method toJson() at gobblin-api/src/main/java/org/apache/gobblin/source/extractor/IWatermark.java:7})

Expected results

A single instance of the Extract Interface refactoring applied to Watermark interface.