ソースコードの類似性ワークショップ 参加者アンケート

SES2009 併設ワークショップ「ソースコードの類似性」に 参加する方は,本アンケートへの回答を ポジションペーパーとしてご投稿ください. ポジションペーパーの作成にあたっては, ポジションの記入見本および 見本のLaTeXソースをご利用ください.

アンケートの設問

本アンケートでは,Java のソースコード片の組を順番に提示していきます (一部のソースコードにはJDK1.4,1.5,1.6のコード片を引用しています).

提示されるソースコードの組が, それぞれ,以下の各観点で述べられた行動を取るほど類似しているか, そうではないか,判断をyes/no で,表形式にて回答してください.

観点A

2つのコード片は類似しているので, 1つのコードにまとめたほうがよい.

観点B

2つのコード片は類似しているので, 一方にバグがあれば,他方にも同様のバグがあるか調べたほうがよい.

観点C

2つのコード片は類似しているので, 一方のコードを再利用できそうな場所では,かわりに他方を使ってもよい.

観点D

2つのコード片は類似しているので, 類似しているという事実を記録して管理したほうがよい.

観点X

著者独自の観点(もしあれば). 著者の研究などに基づく独自の観点がある場合は, その解説をポジションペーパーに記述してください. 独自の観点が特にない場合は,無回答としておいてください.

また,アンケートに提示されているようなソースコードでは 十分に説明ができないと思う場合,「付録」として, 代表例となるようなソースコードをポジションペーパーに添付し, どのような問題を扱いたいかを解説してください.

回答時の注意

ソースコード

以下のソースコード組 No.1〜11について, 前述の観点A,B,C,D,X から見て類似しているかどうかを検討し,yes/no でご回答ください.

2つのコード片における差異は,赤色で着色しています.

No.1

コード片 1-1

class YourClass {
    private int i;
    public YourClass() {
        i = 0;        
    }
    public int getInt() {
        return i;
    }
}

コード片 1-2

class MyClass {
    private int i;
    public MyClass() {
        i = 0;        
    }
    public int getInt() {
        return i;
    }
}

No.2

コード片 2-1

class StoreAppender {
    private int i = 0;
    PrintWriter pw = null;

    public void printAttributes(java.io.PrintWriter writer, int indent, 
                                boolean include, Object bean) throws Exception {
        i = indent;
        pw = writer;
    }

    protected void changeIndent(int indent) {
        i = indent;
    }
}

コード片 2-2

class StoreAppender {
    private int i = 0;
    PrintWriter pw = null;

    public void printAttributes(java.io.PrintWriter writer, int indent, 
                                boolean include, Object bean) throws Exception {
        i = indent;
        pw = writer;
    }

    public void changeIndent(int indent) {
        i = indent;
    }
}

No.3

コード片 3-1

interface HTMLDocument extends org.w3c.dom.Document {
    public String             getTitle();
    public void               setTitle(String title);
    //その他下記インタフェースと全く同じ28メソッド
    public org.w3c.dom.Element getElementById(String elementId);
}

コード片 3-2

interface HTMLDocument extends org.w3c.dom.Document {
    public String             getTitle();
    public void               setTitle(String title);
    //その他上記インタフェースと全く同じ28メソッド
    //getElementById の定義なし
}

No.4

コード片 4-1

import java.net.*;

class Inet6AddressImpl implements InetAddressImpl {
    private InetAddress      anyLocalAddress;
    private InetAddress      loopbackAddress;
    public native String getLocalHostName() throws UnknownHostException;
    public native byte[][]
        lookupAllHostAddr(String hostname) throws UnknownHostException;
    public native String getHostByAddr(byte[] addr) throws UnknownHostException;

    public synchronized InetAddress anyLocalAddress() {
        if (anyLocalAddress == null) {
            if (InetAddress.preferIPv6Address) {
                anyLocalAddress = new Inet6Address();
                anyLocalAddress.hostName = "::";
            } else {
                anyLocalAddress = (new Inet4AddressImpl()).anyLocalAddress();
            }
        }
        return anyLocalAddress;
    }
    //以下1メソッド(約10行)については省略
}

コード片 4-2

import java.net.*;

class Inet4AddressImpl implements InetAddressImpl {
    private InetAddress      anyLocalAddress;
    private InetAddress      loopbackAddress;
    public native String getLocalHostName() throws UnknownHostException;
    public native byte[][]
        lookupAllHostAddr(String hostname) throws UnknownHostException;
    public native String getHostByAddr(byte[] addr) throws UnknownHostException;

    public synchronized InetAddress anyLocalAddress() {
        if (anyLocalAddress == null) {
            anyLocalAddress = new Inet4Address(); // {0x00,0x00,0x00,0x00}
            anyLocalAddress.hostName = "0.0.0.0";
        }
        return anyLocalAddress;
    }
    //以下1メソッド(約10行)については省略,以降も同様の引数チェックの違いが見られる
}

No.5

コード片 5-1

class ListObject {
    private java.util.List<Integer> ll = new java.util.ArrayList<Integer>();
    public ListObject() {
        ll.add(1);
        ll.add(0);
        ll.add(0);
    }
    public int get(int index) {
        return ll.get(index);
    }
}

コード片 5-2

class ListObject {
    private gnu.trove.TIntArrayList ll = new gnu.trove.TIntArrayList();
    public ListObject() {
        ll.add(1);
        ll.add(0);
        ll.add(0);
    }
    public int get(int index) {
        return ll.get(index);
    }
}

No.6

コード片 6-1

import java.util.Vector;
import javax.accessibility.AccessibleState;

interface AccessibleStateSet {
    public Vector states = null;
}

コード片 6-2

import java.util.Vector;
import javax.accessibility.AccessibleState;

interface AccessibleStateSet {
    public Vector<AccessibleState> states = null;
}

No.7

コード片 7-1

import java.io.PrintWriter;

class StoreIndente {
    private int i = 0;
    PrintWriter pw = null;
    public void printAttributes(PrintWriter writer, int indent, boolean include, Object bean) throws Exception {
        i = indent;
        pw = writer;
    }
}

コード片 7-2

import java.io.PrintWriter;

class StoreIndente {
    private int i = 0;
    PrintWriter pw = null;
    public void printAttributes(PrintWriter writer, int indent, boolean include, Object bean) throws Exception {
        changeIndent(indent);
        pw = writer;
    }
    //処理を抽出
    private void changeIndent(int indent) {
        i = indent;
    }
}

No.8

コード片 8-1

public class SpecialList extends List {
    public void sort() {
        //クイックソートアルゴリズムの実装
    }
}

コード片 8-2

public class SpecialList extends List {
    public void sort() {
        //マージソートアルゴリズムの実装
    }
}

No.9

コード片 9-1

final class Byte extends Number implements Comparable {
    public static final byte   MIN_VALUE = -128;
    public static final byte   MAX_VALUE = 127;
    public static final Class    TYPE = Class.getPrimitiveClass("byte");
    public static String toString(byte b) {
        return Integer.toString((int)b, 10);
    }
    //以下16メソッド(約150行程度)については省略
    //以降においても構造は同じであるが同様の引数の型・定数の違いが見られる
}

コード片 9-2

final class Short extends Number implements Comparable {
    public static final short   MIN_VALUE = -32768;
    public static final short   MAX_VALUE = 32767;
    public static final Class    TYPE = Class.getPrimitiveClass("short");
    public static String toString(short s) {
        return Integer.toString((int)s, 10);
    }
    //以下16メソッド(約150行程度)については省略
    //以降においても構造は同じであるが同様の引数の型・定数の違いが見られる
}

No.10

コード片 10-1

public class StoreAppender {
    public void printAttributes(PrintWriter writer, int indent,
            boolean include, Object bean, StoreDescription desc)
            throws Exception {
            if (isPrintValue(bean, bean2, descriptors[i].getName(), desc))
                printValue(writer, indent, descriptors[i].getName(), value);
    }
    //その他の処理(約350行)は同じであるため省略.
}

コード片 10-2

public class StoreAppender {
    public void printAttributes(PrintWriter writer, int indent,
            boolean include, Object bean, StoreDescription desc)
            throws Exception {
            printAttribute(writer, indent, bean, desc, descriptors[i].getName(), bean2, value);
    }
    private void printAttribute(PrintWriter writer, int indent, 
            Object bean, StoreDescription desc, String attributeName, Object bean2, Object value) {
        if (isPrintValue(bean, bean2, attributeName, desc))
            printValue(writer, indent, attributeName, value);
    }
    //その他の処理(約350行)は同じであるため省略
}

No.11

コード片 11-1

public class YourClass {
    private int i;
    public YourClass() {
        i = 0;        
    }
    public int getInt() {
        return i;
    }
}

コード片 11-2

public class MyClass {
    private boolean i;
    public MyClass() {
        i = true;        
    }
    public boolean getBoolean() {
        return i;
    }
}

全11組で本アンケートは終了です. 類似しているかどうかのお考えを,ポジションペーパーとしてご投稿ください.