Constructor de predicado [cerrado] -- # campo con object-oriented camp codereview Relacionados El problema

Predicate builder [closed]


1
vote

problema

Español
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas.

¿Quieres mejorar esta pregunta? Actualizar la pregunta por lo que es on-topic para el intercambio de pila de revisión de código.

cerrado hace 6 años .

Mejorar esta pregunta

Tengo un constructor de predicado que inicialmente evalúa a false . Debido a esto, la siguiente expresión debe ser un 9988776655544331 . Pero si necesito un 99887766655544332 necesito realizar un seguimiento de un valor booleano. Y este valor booleano hasPassedFirstCheck es lo que quiero deshacerme.

  var cars = PredicateBuilder.False<Cars>(); var hasPassedFirstCheck = false;  if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     if (sf.ServiceTypes.Count < 2 && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType== CarType.DJ);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType== CarType.DJ)             : cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; }  if (filterObject.CarTypes.Contains(CarTypes.SUV)) {     if (condition && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType == CarType.SUV);     else         cars = hasPassedFirstCheck              ? cars.Or(x => x.CarType == CarType.SUV)             : cars.And(x => x.CarType == CarType.SUV);      hasPassedFirstCheck = true; }  if (filterObject.CarTypes.Contains(CarTypes.Limo)) {     if (condition && !hasPassedFirstCheck)         cars = cars .And(x => x.CarType == CarType.Limo);     else         cars = hasPassedFirstCheck              ? cars.Or(x => x.CarType== CarType.Limo)             : cars.And(x => x.CarType== CarType.Limo);      hasPassedFirstCheck = true; } if (filterObject.CarTypes.Contains(CarTypes.Race)) {     if (condition && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType == CarType.Race);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType == CarType.Race)             : cars.And(x => x.CarType == CarType.Race);      hasPassedFirstCheck = true; }   

Esto tampoco es realmente OOP. Cualquier sugerencia para refactor, esto es realmente apreciado.

Original en ingles

I have a predicate builder that initially evaluates to false. Because of this, the very next expression should be a logical Or. But if I need a logical And I need to keep track of a boolean value. And this boolean value hasPassedFirstCheck is the thing I want to get rid of.

var cars = PredicateBuilder.False<Cars>(); var hasPassedFirstCheck = false;  if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     if (sf.ServiceTypes.Count < 2 && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType== CarType.DJ);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType== CarType.DJ)             : cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; }  if (filterObject.CarTypes.Contains(CarTypes.SUV)) {     if (condition && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType == CarType.SUV);     else         cars = hasPassedFirstCheck              ? cars.Or(x => x.CarType == CarType.SUV)             : cars.And(x => x.CarType == CarType.SUV);      hasPassedFirstCheck = true; }  if (filterObject.CarTypes.Contains(CarTypes.Limo)) {     if (condition && !hasPassedFirstCheck)         cars = cars .And(x => x.CarType == CarType.Limo);     else         cars = hasPassedFirstCheck              ? cars.Or(x => x.CarType== CarType.Limo)             : cars.And(x => x.CarType== CarType.Limo);      hasPassedFirstCheck = true; } if (filterObject.CarTypes.Contains(CarTypes.Race)) {     if (condition && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType == CarType.Race);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType == CarType.Race)             : cars.And(x => x.CarType == CarType.Race);      hasPassedFirstCheck = true; } 

This also isn't really OOP. Any suggestion to refactor this is really appreciated.

     
         
         

Lista de respuestas

1
 
vote

Si su a6 Si es falso, entonces ninguno de sus a7 se ejecuta. Si es verdad, a8 es siempre a9 , por lo que su código se simplifica a esto:

  b0  

y más reducido, pero menos legible:

  b1  
 

If your condition if false then none of your if's executes. If it's true then condition && !hasPassedFirstCheck is always false, so your code simplifies to this:

var cars = PredicateBuilder.False<Cars>();  if (condition) {     // I guess you have a typo here as both expressions are same     cars = sf.ServiceTypes.Count < 2 ? cars.And(x => x.CarType == CarType.Truk)                                       : cars.And(x => x.CarType == CarType.Truk);      cars = cars.Or(x => x.CarType == CarType.SUV ||                         x.CarType == CarType.Limo ||                         x.CarType == CarType.Race); } 

And further reduced, but less readable:

var cars = !condition ? PredicateBuilder.False<Cars>() :                         (sf.ServiceTypes.Count < 2 ?                                  cars.And(x => x.CarType == CarType.Truk) :                                  cars.And(x => x.CarType == CarType.Truk))                             .Or(x => x.CarType == CarType.SUV ||                                      x.CarType == CarType.Limo ||                                      x.CarType == CarType.Race); 
 
 
 
 
1
 
vote
  1. Parece que tiene un typo en su CarType enum, es probable que sea Truck .
  2. cars es inicialmente False Por lo tanto, puede deshacerse de las condiciones 9988776665544334 porque nunca evaluarán con verdadero de todos modos. Así que, por ejemplo, esto hace que todo este bloque sea inútil:

      if (condition) {     cars = sf.ServiceTypes.Count < 2          ? cars .And(x => x.CarType== CarType.Truk)          : cars .And(x => x.CarType== CarType.Truk);       hasPassedFirstCheck = true; }   

update : Caminemos por el código un poco.

Así es como comienza:

  var cars = PredicateBuilder.False<Cars>(); var hasPassedFirstCheck = false;  if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     if (sf.ServiceTypes.Count < 2 && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType== CarType.DJ);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType== CarType.DJ)             : cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; }   

El predicado inicial se evalúa a false y hasPassedFirstCheck es también. Ingresando el primer bloque Este significa Truck0 es siempre Truck1 y se puede omitir y Truck2 es siempre Truck3 De ahí el < Código> Truck4 La ruta nunca se toma. Dado todo eso, el código se reduce a:

  Truck5  

Obviamente, el cheque Truck6 es redundante porque haces lo mismo en cualquier caso. Por lo que se puede simplificar aún más a:

  Truck7  

Sin embargo, el predicado es Truck9 En ese punto y cars020 evalúa a cars1 . Por lo tanto, la condición cars22 no tiene efecto en el resultado y el bloque se puede simplificar en:

  cars3  

Dado todo esto, no estoy seguro de que

  1. El código que proporcionó es en realidad el código que usa.
  2. que el código está haciendo realmente lo que espera que haga en primer lugar.
 
  1. You seem to have a typo in your CarType enum, it should probably be Truck.
  2. cars is initially False hence you can get rid of the And conditions because they will never evaluate to true anyway. So for example this makes this whole block useless:

    if (condition) {     cars = sf.ServiceTypes.Count < 2          ? cars .And(x => x.CarType== CarType.Truk)          : cars .And(x => x.CarType== CarType.Truk);       hasPassedFirstCheck = true; } 

Update: Let's walk through the code a bit.

This is how it starts:

var cars = PredicateBuilder.False<Cars>(); var hasPassedFirstCheck = false;  if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     if (sf.ServiceTypes.Count < 2 && !hasPassedFirstCheck)         cars = cars.And(x => x.CarType== CarType.DJ);     else         cars = hasPassedFirstCheck             ? cars.Or(x => x.CarType== CarType.DJ)             : cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; } 

The initial predicate evaluates to false and hasPassedFirstCheck is false as well. Entering the first block this means !hasPassedFirstCheck is always true and can be omitted and hasPassedFirstCheck is always false hence the Or path is never taken. Given all of that the code boils down to:

if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     if (sf.ServiceTypes.Count < 2)         cars = cars.And(x => x.CarType== CarType.DJ);     else         cars = cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; } 

Obviously the check if (sf.ServiceTypes.Count < 2) is redundant because you do the same thing in either case. So it can be further simplified to:

if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     cars = cars.And(x => x.CarType== CarType.DJ);      hasPassedFirstCheck = true; } 

However the cars predicate is false at that point and false && Something evaluates to false. Hence the And condition has no effect on the result and the block can be simplified into:

if (filterObject.CarTypes.Contains(CarTypes.Truck)) {     hasPassedFirstCheck = true; } 

Given all of this I'm not sure that

  1. The code you supplied is actually the code you use.
  2. That the code is actually doing what you expect it to do in the first place.
 
 
   
   

Relacionados problema

6  Objetos de Java para un programa de sniffer de red  ( Java objects for a network sniffer program ) 
Estoy trabajando en un programa de sniffer de red, cuya estructura utiliza 3 clases principales: clase de marco - uno por marco monitoreado, sostiene la re...

3  General Pathfinder en Python  ( General pathfinder in python ) 
Recientemente trabajé en un proyecto donde tuve la siguiente configuración: $_{456}$6 Ninguno del Código es relevante, no tendrá que poder ejecutar nada...

1  Clase de juego, escrito usando enums  ( Playing card class written using enums ) 
Escribí una clase de tarjeta A Mientras vuelvas a esta publicación aquí: Pregunta previa Sé que ha pasado mucho tiempo, pero recientemente regresé al proyec...

8  Envoltura Libusb Library en C ++  ( Wrapping libusb library in c ) 
Quiero usar la biblioteca de Libusb en mi aplicación C ++. He creado clases que envuelven las funciones de Libusb. Puede ver que la API de Libusb se divide en...

10  "Stardust" Simulador 2D Gravity - Seguimiento 1: Los planetas  ( Stardust 2d gravity simulator follow up 1 the planets ) 
Este es un seguimiento para el juego de gravedad del simulador 2D pregunta. Desde entonces, he desarrollado mis habilidades de JavaScript, y ahora esto...

5  Solicitud de Tkinter para administrar las tareas escolares  ( Tkinter application to manage school tasks ) 
Soy un principiante en la programación de la OOP y me pregunto cuál es la mejor manera de poner todas las ventanas y funciones de una aplicación de ventana en...

8  Árbol fractal orientado a objetos  ( Object oriented fractal tree ) 
Hice un árbol fractal orientado a objetos en JavaScript utilizando la biblioteca P5, consta de tres archivos: fraternal tree.js sucursal.js flower.js ...

5  ¿Podría mejorarse este sistema de profundidad para un juego?  ( Could this depth system for a game be improved ) 
Todavía soy nuevo en C ++ y no tengo una gran idea de mi codificación, así que estaría muy agradecido a cualquiera y todos los que le otorgan consejos. Ade...

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

1  Pasando un objeto a la vista en CodeIgner  ( Passing an object to the view in codeigniter ) 
Estoy tratando de usar un objeto y persistirlo en la base de datos. He creado una clase en la carpeta de la biblioteca. <?php if (!defined('BASEPATH'))...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos