2

我目前正在重构两个应用程序项目使用的项目并面临以下问题:

旧项目应该拆分为三个新项目 A、B 和 C,因为它的增长和变得混乱。

所以项目 A 正在实现应用程序 1 使用的类,项目 B 正在实现应用程序 2 使用的一些其他类,应用程序 1 和 2 使用的其余类应在项目 C 中实现。

http://i.imgur.com/8GvGSJ2.png

我已经开始重构,所以结构是存在的并且可以工作。现在我想知道,项目 C 中是否还有只由应用程序 1 或应用程序 2 使用的类

因为大约有 500 个 Java 类,所以我想使用一个脚本来查看一个 Java 类是由项目 A、B 还是两者都实现的。在eclipse中手动我可以选择每个java类的类名并转到“references --> workspace”并检查结果,但我希望有人有更好的主意:-)

先感谢您!

4

1 回答 1

1

我现在写了一个 powershellscript,它可以在项目 c 中找到任何 java 文件。然后它在项目a和b的每个java文件中搜索项目c的java类的名称并整理出来,在每个项目中都没有找到。

我不得不说这不会涵盖任何继承......所以这只是一个要搜索的类的提示。

奇怪的解决方案,但我认为它有效,代码如下:

# all classes used in the project C
$classNames = New-Object System.Collections.ArrayList
Get-ChildItem "path-to-project-C" -Recurse -Filter *.java | `
Sort-Object -Descending | `
Foreach-Object {
    $className = $_.name.Split(".")
    #[void] to prevent .add-function to pass the added index into console
    [void]$classNames.add($className[0])
}

# all classes of project C used in project A
$projectA_classes = New-Object System.Collections.ArrayList
Get-ChildItem "path-to-project-A" -Recurse -Filter *.java | `
Foreach-Object {
    $path = $_.FullName
    foreach ($class in $classNames){
        if(Select-String -Path $path -pattern $class -quiet) {
            [void]$projectA_classes.add($class)
        }
    }
}

write-host $projectA_classes.count classes used by project A

# all classes of project C used in project B
$projectB_classes = New-Object System.Collections.ArrayList
Get-ChildItem "path-to-project-B" -Recurse -Filter *.java | `
Foreach-Object {
    $path = $_.FullName
    foreach ($class in $classNames){
        if(Select-String -Path $path -pattern $class -quiet) {
            [void]$projectB_classes.add($class)
        }
    }
}

write-host $projectB_classes.count classes used by daemon project

#find classes not used by porject A
$projectB_classesNotUsedByProjectA = New-Object System.Collections.ArrayList
foreach ($class in $projectB_classes) {
    if(!($projectA_classes.contains($class))) {
        if(!($projectB_classesNotUsedByProjectA.contains($class))) {
            [void]$projectB_classesNotUsedByProjectA.add($class);
        }
    }
}

#find classes not used by porject B
$projectA_classesNotUsedByProjectB = New-Object System.Collections.ArrayList
foreach ($class in $projectA_classes) {
    if(!($projectB_classes.contains($class))) {
        if(!($projectA_classesNotUsedByProjectB.contains($class))) {
            [void]$projectA_classesNotUsedByProjectB.add($class);
        }

    }
}

write-host $projectB_classesNotUsedByProjectA.count classes not used by project A
write-host $projectA_classesNotUsedByProjectB.count classes not used by project B

write-host Classes not used by project A: $projectB_classesNotUsedByProjectA
write-host Classes not used by project B: $projectA_classesNotUsedByProjectB

我不会选择这个作为正确答案,因为我希望有更好的解决方案。

于 2015-08-27T13:32:31.850 回答