কোটলিন দ্বারা উত্পাদিত অপ্রয়োজনীয় নাল চেকটি কীভাবে আবরণ করবেন?


9

নিম্নলিখিত ন্যূনতম কোটলিন উদাহরণ বিবেচনা করুন:

fun <U> someWrapper(supplier: () -> U): () -> (U) {
    return { supplier() }
}

fun foo(taskExecutor: TaskExecutor): Int {
    val future = CompletableFuture.supplyAsync(someWrapper {
        42
    }, taskExecutor::execute)
    return future.join()
}

@Test
public void shouldFoo() {
    assertThat(foo(), is(42));
}

জ্যাকোতে আমার শাখা কভারেজের নিয়ম রয়েছে, যা উপরের কোডটির জন্য ব্যর্থ হয়েছে, বলছে যে 2 টির মধ্যে 1 টি someWrapperকলের লাইনে আচ্ছাদিত নয় । দুর্ভাগ্যক্রমে, আমার কাছে সমস্ত শ্রেণি বাদ দেওয়া উচিত নয় যা someWrapperবলা হয় lude

পচনশীল জাভা কোডটি দেখছেন:

public final int foo(TaskExecutor taskExecutor) {
    Object var10000 = WrappersKt.someWrapper((Function0)null.INSTANCE);
    if (var10000 != null) {
        Object var2 = var10000;
        var10000 = new Foo$sam$java_util_function_Supplier$0((Function0)var2);
    }

    Supplier var3 = (Supplier)var10000;
    Function1 var4 = (Function1)(new Function1(this.taskExecutor) {
        // $FF: synthetic method
        // $FF: bridge method
        public Object invoke(Object var1) {
        this.invoke((Runnable)var1);
        return Unit.INSTANCE;
        }

        public final void invoke(Runnable p1) {
        ((TaskExecutor)this.receiver).execute(p1);
        }

        public final KDeclarationContainer getOwner() {
        return Reflection.getOrCreateKotlinClass(TaskExecutor.class);
        }

        public final String getName() {
        return "execute";
        }

        public final String getSignature() {
        return "execute(Ljava/lang/Runnable;)V";
        }
    });
    CompletableFuture future = CompletableFuture.supplyAsync(var3, (Executor)(new Foo$sam$java_util_concurrent_Executor$0(var4)));
    var10000 = future.join();
    Intrinsics.checkExpressionValueIsNotNull(var10000, "future.join()");
    return ((Number)var10000).intValue();
}

আমি মনে করি, সমস্যাটি if (var10000 != null)শাখা, যা এমনকি IDE দ্বারা অপ্রয়োজনীয় (সর্বদা সত্য) হিসাবে চিহ্নিত করা হয়।

কোডটি কোনওভাবে এমনভাবে সামঞ্জস্য করা সম্ভব যে সমস্ত শাখাগুলি coverাকা দেওয়া সম্ভব। কম্পাইলার অতিরিক্ত নাল চেক তৈরি করে না তা নিশ্চিত করে? আমি উভয়ের কোড পরিবর্তন করতে পারি foo(..)এবং someWrapper(..)যতক্ষণ না আমি সজ্জিত ল্যাম্বডা সরবরাহ করতে সক্ষম হয়।

আমি কোটলিন 1.3.50 এবং জ্যাকো 0.8.4 ব্যবহার করি।

সম্পাদনা করুন।

একটি সুস্পষ্ট কর্মসূচী হ'ল supplyAsync(someWrapper { ... })কিছু ব্যবহার শ্রেণিতে নিষ্কাশন করা এবং সেই শ্রেণিকে কেবল বাদ দেওয়া, যেমন:

fun <U> supplyAsync(supplier: () -> U, executor: TaskExecutor): CompletableFuture<U> {
    return CompletableFuture.supplyAsync(someWrapper { supplier() }, executor::execute)
}

এটি আমার পক্ষে যথেষ্ট ভাল, যদিও আমি এখনও আগ্রহী যে কেন কোটলিন দ্বারা শাখাটি যুক্ত করা হয়েছে, যেখানে কোনও শাখা হওয়ার দরকার নেই branch


Type inference failedআপনার নমুনা কোডটি সংকলন করার চেষ্টা করার সময় আমি পেয়েছি । আপনি যদি বাক্সের বাইরে কাজ করে এমন নমুনা কোড সরবরাহ করতে পারেন তবে দুর্দান্ত হবে! উদাহরণস্বরূপ, taskExecutorএবং controllerঅজানা।
এনসেলিক

@ এনসেলিক বিভ্রান্তিকর ত্রুটিগুলি সরানোর জন্য একটি ছোট সম্পাদনা যুক্ত করেছে। আমি এটি আরও পূর্ণ কোডে আরও প্রসারিত করতে যাচ্ছি না কারণ ধারণাটি পাওয়ার পক্ষে এটি পর্যাপ্ত হওয়া উচিত।
বিকে ই

1
জ্যাকোকো কীভাবে কোটলিনকে সমর্থন করার জন্য অগ্রগামীভাবে গ্রহণ করে ( github.com/jacoco/jacoco/relayss দেখুন এবং "কোটলিন সংকলক দ্বারা যুক্ত করা হয়েছে" অনুসন্ধান করুন) দেখে আমি মনে করি এটি খুব শীঘ্রই বা আরও ঠিক করা হতে চলেছে another আপনি যদি আপনার কভারেজ শীর্ষে রাখতে গুরুতর বোধ করেন তবে আমি কোনও সমস্যা প্রতিবেদন করার পরামর্শ দিচ্ছি।
পিয়ট্রিক

উত্তর:


1

যদি এর রিটার্ন মানটি someWrapperকেবল উদাহরণ হিসাবে ব্যবহৃত হয় Supplierতবে আপনি Supplierরিটার্নের ধরণ হিসাবে স্পষ্টভাবে ব্যবহার করে অপ্রয়োজনীয় নাল চেকটি সরাতে পারেন।

fun <U> someWrapper(supplier: () -> U): Supplier<U> {
    return Supplier { supplier() }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.