now() czy dopuszczalne?

now() czy dopuszczalne?
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
0

Przykład:

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

LocalDateTime() to ten now()

edytowany 2x, ostatnio: Julian_
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
3

Niewybaczalne.


jeden i pół terabajta powinno wystarczyć każdemu
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
1

Nie pozwalam, Needs more work.


”Engineering is easy. People are hard.” Bill Coughran
Michał Sikora
Michał Sikora
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
0

jusz...

Kopiuj
    @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();
    }
Kopiuj
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.

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
1

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


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
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.

Kopiuj
@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

edytowany 4x, ostatnio: Julian_
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
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?


”Engineering is easy. People are hard.” Bill Coughran
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
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?

edytowany 3x, ostatnio: Julian_
PI
Uwielbiam Twój styl pisania :D
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
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)


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
Zobacz pozostały 1 komentarz
Charles_Ray
Brzmi słabo, ale może kiedyś tak się kodowało. Nie wiem, nie programuje od 2 lat...
jarekr000000
@Julian_ a ten jirowy kod wymaga Springa? Bo kiedyś pisałem trochę pluginów do jiry i nawet sobie ich api trochę chwaliłem... nie pamiętam springa jakoś w tym kontekście.
Julian_
oni mają jakiegoś swojego springa atlassian-spring-scanner-annotation czy atlassian-spring-scanner-runtime i swoje adnotacje np. @ComponentImport
Charles_Ray
NIH syndrome? :)
jarekr000000
@Charles_Ray: strzelam, że raczej typowy glue dopasowujący runtime springa do wymogów konkretnego środowiska. Nie wiem jak w tym przypadku, ale w innych robiło się to aby uspokoić tych wszystkich oszołomów, którzy musza zawsze mieć springan nawet jak to nie ma najmniejszego sensu i robi kłopoty (np, w OSGI).
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
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. :)

Kopiuj
    @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();
    }
Kopiuj
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;
    }
}
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
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.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
0

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

title

edytowany 3x, ostatnio: Julian_
Zobacz pozostały 1 komentarz
Julian_
new org.joda.time.LocalDateTime(clockProvider.getClock()) będzie działać? Chyba wezmę jakiś jodowy MillisProvider...
Charles_Ray
Nie jestem kompilatorę
Julian_
dupa, nie działa, zrobiłem se swój JodaCurrentDateTimeProvider ;)
jarekr000000
Fajnie @Julian_ ma api specjalnie dla siebie w JodaTime - zazdroszczam.
PI
@jarekr000000: też na to zwróciłem uwagę :D :D
krancki
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:74.7261832, -41.7409518
  • Postów:151
0

Zobacz takiego providera

Kopiuj
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);
}


edytowany 1x, ostatnio: krancki
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
0
Kopiuj
public interface IssueFilter extends Predicate<Issue> {

    @Override
    boolean test(Issue issue);
}
Kopiuj
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);
    }
}
Kopiuj
public interface JodaDateTimeProvider {
    Long getMillis();
    DateTimeZone getDateTimeZone();

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

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

hehe

danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
3

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


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.