Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 5a9a419

Browse files
committed
refactor: Replace static sortNodes method with instance method in Nodes class for improved encapsulation
1 parent 8a58f17 commit 5a9a419

File tree

6 files changed

+50
-33
lines changed

6 files changed

+50
-33
lines changed

src/ClassDiagramRenderer/ClassDiagram.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
namespace Tasuku43\MermaidClassDiagram\ClassDiagramRenderer;
55

66
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Node;
7+
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Nodes;
78
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Relationship\Dependency;
89
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Relationship\Composition;
910
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Relationship\Inheritance;
@@ -13,22 +14,19 @@
1314

1415
class ClassDiagram
1516
{
16-
/**
17-
* @var Node[]
18-
*/
19-
private array $nodes;
17+
private Nodes $nodes;
2018

2119
private Relationships $relationships;
2220

2321
public function __construct()
2422
{
25-
$this->nodes = [];
23+
$this->nodes = Nodes::empty();
2624
$this->relationships = Relationships::empty();
2725
}
2826

2927
public function addNode(Node $node): self
3028
{
31-
$this->nodes[] = $node;
29+
$this->nodes->add($node);
3230

3331
return $this;
3432
}
@@ -44,12 +42,13 @@ public function addRelationships(Relationship ...$relationships): self
4442

4543
public function render(RenderOptions $options = null): string
4644
{
47-
Node::sortNodes($this->nodes);
45+
$this->nodes->sort();
46+
$nodes = $this->nodes->getAllNodes();
4847
$this->relationships->sort();
4948

5049
$output = "classDiagram\n";
5150

52-
foreach ($this->nodes as $node) {
51+
foreach ($nodes as $node) {
5352
$output .= " " . $node->render() . "\n";
5453
}
5554

src/ClassDiagramRenderer/Node/Node.php

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,4 @@ private function collectTraitRelations(Node $traitNode, array &$visited, array &
131131
$this->collectTraitRelations($nestedTrait, $visited, $compositionsOut, $dependenciesOut);
132132
}
133133
}
134-
135-
public static function sortNodes(array &$nodes): void
136-
{
137-
usort($nodes, function (Node $a, Node $b) {
138-
return strcmp($a->nodeName(), $b->nodeName());
139-
});
140-
}
141134
}

src/ClassDiagramRenderer/Node/Nodes.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public function findByName(string $nodeName): ?Node
3131
return $this->nodes[$nodeName] ?? null;
3232
}
3333

34+
public function sort(): void
35+
{
36+
// Keys are node names; sort by key keeps deterministic order
37+
ksort($this->nodes);
38+
}
39+
3440
/**
3541
* @return Node[]
3642
*/

tests/ClassDiagramRenderer/ClassDiagramBuilderTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class AbstractController {
4242
}
4343
class AuditLogger {
4444
}
45+
class AuditTarget {
46+
}
4547
class RepositoryAwareTrait {
4648
<<trait>>
4749
}
@@ -61,6 +63,7 @@ class UserStatus {
6163
}
6264
6365
RepositoryAwareTrait *-- AuditLogger: composition
66+
RepositoryAwareTrait ..> AuditTarget: dependency
6467
RepositoryAwareTrait ..> User: dependency
6568
RepositoryAwareTrait *-- UserRepositoryInterface: composition
6669
User *-- UserStatus: composition
@@ -70,6 +73,7 @@ class UserStatus {
7073
UserRepositoryInterface <|.. UserRepository: realization
7174
UserRepositoryInterface ..> User: dependency
7275
UserService *-- AuditLogger: composition
76+
UserService ..> AuditTarget: dependency
7377
UserService ..> InvalidArgumentException: dependency
7478
UserService ..> User: dependency
7579
UserService *-- UserRepositoryInterface: composition
@@ -115,6 +119,8 @@ class AbstractController {
115119
}
116120
class AuditLogger {
117121
}
122+
class AuditTarget {
123+
}
118124
class RepositoryAwareTrait {
119125
<<trait>>
120126
}

tests/ClassDiagramRenderer/Node/NodeTest.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,24 +84,6 @@ public function testDepend(): void
8484
$this->assertInstanceOf(Dependency::class, $relationships[0]);
8585
}
8686

87-
/**
88-
* Test the sortNodes static method
89-
*/
90-
public function testSortNodes(): void
91-
{
92-
$nodeC = $this->createMockNode('C');
93-
$nodeA = $this->createMockNode('A');
94-
$nodeB = $this->createMockNode('B');
95-
96-
$nodes = [$nodeC, $nodeA, $nodeB];
97-
98-
Node::sortNodes($nodes);
99-
100-
$this->assertEquals('A', $nodes[0]->nodeName());
101-
$this->assertEquals('B', $nodes[1]->nodeName());
102-
$this->assertEquals('C', $nodes[2]->nodeName());
103-
}
104-
10587
/**
10688
* Test multiple relationships
10789
*/

tests/ClassDiagramRenderer/Node/NodesTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,41 @@
55

66
use PHPUnit\Framework\TestCase;
77
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Class_;
8+
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Node;
89
use Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Nodes;
910

1011
class NodesTest extends TestCase
1112
{
13+
public function testSort(): void
14+
{
15+
$nodes = Nodes::empty();
16+
17+
$c = $this->mockNode('C');
18+
$a = $this->mockNode('A');
19+
$b = $this->mockNode('B');
20+
21+
// Add out of order
22+
$nodes->add($c)->add($a)->add($b);
23+
24+
// Sort by name
25+
$nodes->sort();
26+
$sorted = array_values($nodes->getAllNodes());
27+
28+
$this->assertSame('A', $sorted[0]->nodeName());
29+
$this->assertSame('B', $sorted[1]->nodeName());
30+
$this->assertSame('C', $sorted[2]->nodeName());
31+
}
32+
33+
private function mockNode(string $name): Node
34+
{
35+
return new class($name) extends Node {
36+
public function render(): string
37+
{
38+
return "class {$this->name} {}";
39+
}
40+
};
41+
}
42+
1243
/**
1344
* Test the add and getAllNodes methods
1445
*/

0 commit comments

Comments
 (0)