now() czy dopuszczalne?

0

Przykład:

@Bean
public Predicate<Issue> myFilter(@Qualifier("age") Integer age) {
    return x -> x.getCreationDate().toLocalDateTime().plusMinutes(age).isBefore(new LocalDateTime());
}

LocalDateTime() to ten now()

4

Wielu mówi że tak, ale jeśli użyjesz now nie będziesz już mógł testować dowolnego czasu i możliwe że dane do testów przestaną działać po pewnym czasie

3

Niewybaczalne.

1

Nie pozwalam, Needs more work.

0

jusz...

    @Bean
    public IssueFilter issueFilter(@Qualifier("wantedStatus") IssueStatus wantedStatus,
                                   @Qualifier("issueAgeMinutes") Integer issueAgeMinutes,
                                   LocalDateTime nowDateTime) {
        return new IssueFilter(wantedStatus.name, issueAgeMinutes, nowDateTime);
    }

    @Bean
    public LocalDateTime nowDateTime() {
        return new LocalDateTime();
    }
public class IssueFilter implements Predicate<Issue> {

    private String wantedStatusName;
    private Integer issueAgeMinutes;
    private LocalDateTime nowDateTime;

    public IssueFilter(String wantedStatusName, Integer issueAgeMinutes, LocalDateTime nowDateTime) {
        this.wantedStatusName = wantedStatusName;
        this.issueAgeMinutes = issueAgeMinutes;
        this.nowDateTime = nowDateTime;
    }

    @Override
    public boolean test(Issue issue) {
        boolean statusFlag = issue.getStatus().getName().equals(wantedStatusName);
        boolean ageFlag = issue.getCreationDate().toLocalDateTime().plusMinutes(issueAgeMinutes).isBefore(nowDateTime);
        return statusFlag & ageFlag;
    }

    public String getWantedStatusName() {
        return wantedStatusName;
    }

    public void setWantedStatusName(String wantedStatusName) {
        this.wantedStatusName = wantedStatusName;
    }

    public Integer getIssueAgeMinutes() {
        return issueAgeMinutes;
    }

    public void setIssueAgeMinutes(Integer issueAgeMinutes) {
        this.issueAgeMinutes = issueAgeMinutes;
    }

    public LocalDateTime getNowDateTime() {
        return nowDateTime;
    }

    public void setNowDateTime(LocalDateTime nowDateTime) {
        this.nowDateTime = nowDateTime;
    }
}

z 3 linijek na 70.

1

Po ci Ci ten getter i setter? Mało trąbimy o immutability? Poczytaj o dependency inversion i takiej klasie Clock :)

0
Charles_Ray napisał(a):

Po ci Ci ten getter i setter? Mało trąbimy o immutability?

Tylko nie kaz mi tworzyć jednorazowych Producentów, bo one korzystaja z tego mojego Predicate przy każdym produkowaniu. Każdy start produkcji musi dac nowy "now" do Predykatu.

@Override
    public Iterable<Issue> produce(LocalDateTime dateTime) {
        Iterable<Issue> issues = service.findAllIssues(projectName);

        issueFilter.setNowDateTime(dateTime);

        return StreamSupport.stream(issues.spliterator(), false)
                .sorted((i1, i2) -> localDateTimeComparator.compare(i1.getCreationDate().toLocalDateTime(), i2.getCreationDate().toLocalDateTime()))
                .filter(issueFilter)
                .peek(i -> logger.info("Collected Issue " + i.getKey()))
                .collect(Collectors.toList());
    }

ps.
no chyba ze fabryke filtera bede zapodawal do producenta

1

Nikomu nie mogę nic kazać ;) zrób sobie CurrentTimeProvidera, którego wstrzykniesz jak człowiek przez konstruktor. W testach będziesz mógł sobie go podmienić, aby zwracał spreparowany czas bieżący.

Inna sprawa, ten spliterator wyglada masakrycznie, bebechy na wierzchu. Dlaczego nie możesz polegać na Liscie, tylko na jakimś Iterablu, który jest niepraktyczny?

0
Charles_Ray napisał(a):

Inna sprawa, ten spliterator wyglada masakrycznie, bebechy na wierzchu. Dlaczego nie możesz polegać na Liscie, tylko na jakimś Iterablu, który jest niepraktyczny?

A to pytanie do Wojciecha Seligi. ;) Pracował w Atlassianie, a to są bibliteki Atlassianowe.

Charles_Ray napisał(a):

zrób sobie CurrentTimeProvidera, którego wstrzykniesz jak człowiek przez konstruktor.

Nie jestem pewien czy wiem o co chodzi, pokazesz przyklad?

2

Nie mogę znaleźć odpowiedniego artykułu, najbliżej jest chyba to: https://blog.crafties.fr/2017/07/20/controlling-time-in-java/

Offtop: Myślisz, że Seliga pisał/reviewował cały kod, który jest w A? (Zaraz się okaże, że to rzeczywiście jego kod)

0
Charles_Ray napisał(a):

Nie mogę znaleźć odpowiedniego artykułu, najbliżej jest chyba to: https://blog.crafties.fr/2017/07/20/controlling-time-in-java/

Dzięki, chyba już sczaiłem jaki tego sens. :)

    @Bean
    public IssueFilter issueFilter(@Qualifier("wantedStatus") IssueStatus wantedStatus,
                                   @Qualifier("issueAgeMinutes") Integer issueAgeMinutes,
                                   @Qualifier("systemClockProvider") ClockProvider clockProvider) {
        return new IssueFilterByStatusAndCreationDate(wantedStatus.name, issueAgeMinutes, clockProvider);
    }

    @Bean("systemClockProvider")
    public ClockProvider clockProvider() {
        return () -> Clock.systemDefaultZone();
    }
public final class IssueFilterByStatusAndCreationDate implements IssueFilter {

    private final String wantedStatusName;
    private final Integer issueAgeMinutes;
    private final ClockProvider clockProvider;

    public IssueFilterByStatusAndCreationDate(String wantedStatusName, Integer issueAgeMinutes, ClockProvider clockProvider) {
        this.wantedStatusName = wantedStatusName;
        this.issueAgeMinutes = issueAgeMinutes;
        this.clockProvider = clockProvider;
    }

    @Override
    public boolean test(Issue issue) {
        boolean statusFlag = issue.getStatus().getName().equals(wantedStatusName);
        boolean ageFlag = issue.getCreationDate().toLocalDateTime().plusMinutes(issueAgeMinutes).isBefore(new LocalDateTime(clockProvider.getClock()));
        return statusFlag & ageFlag;
    }
}
4

No i super. To teraz te flagi wrzuć w prywatne metody i zamiast & zrob &&, to dam approve’a. Metoda test może mieć spokojnie jedna linijkę i być dzięki temu 100x bardziej czytelna.

0

kurde chyba coś namieszałem, bo ten mój LocalDateTime to org.joda...

title

0

Zobacz takiego providera

interface TimeProvider {
OffsetDateTime nowAsDateTime();
}

@Component
@Profile("!test")
class DefaultTimeProvider implement TimeProvider{
DateTime nowAsDateTime(){
    return DateTime.now();
}
}


@Component
@Profile("test")
class TestTimeProvider implement TimeProvider
private Clock currentClock = Clock.systemDefaultZone();

void setDefaultClock(){
currentClock= Clock.systemDefaultZone();
}

void setFixedClock(DateTime date){
currentClock = Clock.fixed(date); 
}

DateTime nowAsDateTime(){
return DateTime.now(currentClock);
}


0
public interface IssueFilter extends Predicate<Issue> {

    @Override
    boolean test(Issue issue);
}
public final class IssueFilterByStatusAndCreationDate implements IssueFilter {

    private final String wantedStatusName;
    private final Integer issueAgeMinutes;
    private final JodaDateTimeProvider dateTimeProvider;

    public IssueFilterByStatusAndCreationDate(String wantedStatusName, Integer issueAgeMinutes, JodaDateTimeProvider dateTimeProvider) {
        this.wantedStatusName = wantedStatusName;
        this.issueAgeMinutes = issueAgeMinutes;
        this.dateTimeProvider = dateTimeProvider;
    }

    @Override
    public boolean test(Issue issue) {
        return getStatusFlag(issue) && getAgeFlag(issue);
    }

    private boolean getStatusFlag(Issue issue) {
        return issue.getStatus().getName().equals(wantedStatusName);
    }

    private boolean getAgeFlag(Issue issue) {
        LocalDateTime issueTriggerLocalDateTime = issue.getCreationDate().toLocalDateTime().plusMinutes(issueAgeMinutes);
        LocalDateTime providedLocalDateTime = dateTimeProvider.getDateTime().toLocalDateTime();
        return ! issueTriggerLocalDateTime.isAfter(providedLocalDateTime);
    }
}
public interface JodaDateTimeProvider {
    Long getMillis();
    DateTimeZone getDateTimeZone();

    default DateTime getDateTime() {
        return new DateTime(getMillis(), getDateTimeZone());
    }
}
public class JodaDateTimeProviderCurrent implements JodaDateTimeProvider {
    @Override
    public Long getMillis() {
        return DateTimeUtils.currentTimeMillis();
    }

    @Override
    public DateTimeZone getDateTimeZone() {
        return DateTimeZone.getDefault();
    }
}

hehe

3

Może chcesz przetestować Haste? ( ͡° ͜ʖ ͡°)

1 użytkowników online, w tym zalogowanych: 0, gości: 1