# Modules

It might seem like the kind of modules that Parnas was describing don’t exist in Java or Python, but they actually do - we just don’t call them “modules”. Consider how you would compute the square root of a number:

``Math.sqrt(9.5);``
``math.sqrt(9.5)``

The `Math` or `math` class in this example is actually used just like a module! We can’t see the underlying implementation of the `sqrt()` method, it just provides to us a well-defined interface (i.e. you call it with the symbol `sqrt` and a value as a parameter). This method and other related math functions are encapsulated within the `Math` or `math` class.

We can define our own module-like classes by making them `static`, i.e. we could group our vector math functions into a static `VectorMath` class.

``````import java.lang.Math;

public static class VectorMath(){

public static double dotProduct(Vector3 a, Vector3 b){
return a.x * b.x + a.y * b.y + a.z * b.z;
}

public static double magnitude(Vector3 a){
return Math.sqrt(Math.pow(a.x, 2) + Math.pow(a.y, 2) + Math.pow(a.z, 2));
}
}``````

Usage:

``````Vector3 vect1 = new Vector3(3.0, 4.0, 5.0);
Vector3 vect2 = new Vector3(6.0, 7.0, 8.0);
System.out.println(VectorMath.dotProduct(vect1, vect2));
System.out.println(VectorMath.magnitude(vect1));``````
``````import math

class VectorMath:

@staticmethod
def dot_product(a: Vector3, b: Vector3) -> float:
return a.x * b.x + a.y * b.y + a.z * b.z

@staticmethod
def magnitude(a: Vector3) -> float:
return math.sqrt(a.x ** 2 + a.y ** 2 + a.z ** 2)``````

Usage:

``````vect1: Vector3 = Vector3(3.0, 4.0, 5.0)
vect2: Vector3 = Vector3(6.0, 7.0, 8.0)
print(VectorMath.dot_product(vect1, vect2))
print(VectorMath.magnitude(vect2))``````