Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,23 @@
import com.company.app.PvModuleLayouts;
import com.company.app.PvModulePosition;
import com.company.app.RoofFace;
import com.company.app.pvmodulelayouts.layoutspecification.PvModulesMountedOnRoofFacePlaneLayoutSpecification;
import com.company.app.pvmodulelayouts.layoutspecification.PvModulesMountedOnTiltedRacksLayoutSpecification;

import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Stream;

public class DefaultPvModuleLayouts implements PvModuleLayouts {
private final BiFunction<RoofFace, PvModuleDefinition, LayoutSpecification> layoutSpecificationConstructor;

public DefaultPvModuleLayouts(
BiFunction<RoofFace, PvModuleDefinition, LayoutSpecification> layoutSpecificationConstructor
) {
this.layoutSpecificationConstructor = layoutSpecificationConstructor;
}
Comment on lines +13 to +19
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the constructor required more parameters, we'd probably have to introduce something like this

interface LayoutSpecificationConstructor {
    LayoutSpecification construct(
        RoofFace roofFace,
        PvModuleDefinition pvModuleDefinition,
        Object someOtherArg1,
        Object someOtherArg2
     );
}

probably as a nested interface inside LayoutSpecification


@Override
public List<PvModulePosition> optimalLayoutFor(RoofFace roofFace, PvModuleDefinition pvModuleDefinition) {
var layoutSpecification = roofFace.slopeAngleInDegrees() < 10
? new PvModulesMountedOnRoofFacePlaneLayoutSpecification(pvModuleDefinition)
: new PvModulesMountedOnTiltedRacksLayoutSpecification(pvModuleDefinition);
var layoutSpecification = layoutSpecificationConstructor.apply(roofFace, pvModuleDefinition);

return optimalLayoutTiles(roofFace, layoutSpecification)
.flatMap(layoutTile -> layoutSpecification.splitIntoPvModulePositions(layoutTile))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
* Let's assume the logic is that PV modules are always mounted individually and in portrait orientation.
* (i.e. the unit of placement (layout tile) is a single PV module in portrait orientation)
*/
public class PvModulesMountedOnRoofFacePlaneLayoutSpecification implements LayoutSpecification {
class PvModulesMountedOnRoofFacePlaneLayoutSpecification implements LayoutSpecification {
private final PvModuleDefinition pvModuleDefinition;

public PvModulesMountedOnRoofFacePlaneLayoutSpecification(PvModuleDefinition pvModuleDefinition) {
PvModulesMountedOnRoofFacePlaneLayoutSpecification(PvModuleDefinition pvModuleDefinition) {
this.pvModuleDefinition = pvModuleDefinition;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
* Let's assume the logic is that PV modules are always mounted in rows of 3 in landscape orientation
* (i.e. the unit of placement (layout tile) is a group of 3 PV modules in landscape orientation)
*/
public class PvModulesMountedOnTiltedRacksLayoutSpecification implements LayoutSpecification {
class PvModulesMountedOnTiltedRacksLayoutSpecification implements LayoutSpecification {
private final PvModuleDefinition pvModuleDefinition;

public PvModulesMountedOnTiltedRacksLayoutSpecification(PvModuleDefinition pvModuleDefinition) {
PvModulesMountedOnTiltedRacksLayoutSpecification(PvModuleDefinition pvModuleDefinition) {
this.pvModuleDefinition = pvModuleDefinition;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.company.app.pvmodulelayouts.layoutspecification;

import com.company.app.PvModuleDefinition;
import com.company.app.PvModulePosition;
import com.company.app.RoofFace;
import com.company.app.pvmodulelayouts.LayoutSpecification;
import com.company.app.pvmodulelayouts.LayoutTile;

import java.util.stream.Stream;

public class RoofSlopeDependentLayoutSpecification implements LayoutSpecification {
private final LayoutSpecification delegate;

public RoofSlopeDependentLayoutSpecification(RoofFace roofFace, PvModuleDefinition pvModuleDefinition) {
this.delegate = roofFace.slopeAngleInDegrees() < 10
? new PvModulesMountedOnRoofFacePlaneLayoutSpecification(pvModuleDefinition)
: new PvModulesMountedOnTiltedRacksLayoutSpecification(pvModuleDefinition);
}

@Override
public double tileWidth() {
return delegate.tileWidth();
}

@Override
public double tileLength() {
return delegate.tileLength();
}

@Override
public Stream<PvModulePosition> splitIntoPvModulePositions(LayoutTile layoutTile) {
return delegate.splitIntoPvModulePositions(layoutTile);
}
}
13 changes: 13 additions & 0 deletions case-1/src/main/java/com/company/appconfig/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.company.appconfig;

import com.company.app.PvModuleLayouts;
import com.company.app.pvmodulelayouts.DefaultPvModuleLayouts;
import com.company.app.pvmodulelayouts.layoutspecification.RoofSlopeDependentLayoutSpecification;

// @Configuration
public class Main {
// @Bean
public PvModuleLayouts pvModuleLayouts() {
return new DefaultPvModuleLayouts(RoofSlopeDependentLayoutSpecification::new);
}
}
Comment on lines +1 to +13
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code that would plug everything together goes into a parallel package hierarchy