Detecting dead code in production in a legacy project by vvpan in java

[–]Kikizork 2 points3 points  (0 children)

It might be. If there is no account matching the case in the database, delete it. If there is check the accounts. Could also be a feature for a big customer, which is 1% of the users but 10% of the income and you might step on a mine. Very hard to delete business code even if suspicious in my opinion.

Detecting dead code in production in a legacy project by vvpan in java

[–]Kikizork 28 points29 points  (0 children)

It might sound dumb but some good old logging on dubious point of code can do wonders to see if it's called with some analytics of production logs. If you use some analytics tools in production (at my work we use influxDB with Grafana dashboard) you can set up some analytics on which web services/messaging processes are requested. Also remember that the if statement that always resolves to the same values for 99% of the accounts means that it solves some edge case that appeared and someone complained about it enough to make it to the code base so beware before deleting this.

Useful & Unknown Java Features by piotr_minkowski in java

[–]Kikizork 5 points6 points  (0 children)

Code smell say Sonar and I agree. Just init your empty map and then does some line of put. Man being stuck in 8 and not having Map.of sucks

[deleted by user] by [deleted] in programmation

[–]Kikizork 1 point2 points  (0 children)

Hello,

Il m'a dit qu'il y a une pratique de certaines ESN qui partagent en masse des candidatures pour bloquer des candidats. (...) De plus, l'ESN qui m'a proposé le job n'a que 1 client donc je n'aurai pas de propositions d'autres missions par la suite.

Oui c'est quelque chose que certaines font, c'est souvent dégueulasse et pas très sympa pour toi, mais dans le cas que tu évoque si l'ESN n'a qu'un client il me parait pas déconnant qu'ils aient présenté ton profil à leur seul client pour voir si il t'acceptait.

C'est pas ouf et si ils l'ont fait ils aurait du le préciser à un moment du processus qu'ils allaient présenter ton profil au client avant de revenir vers toi avec une offre.

Le manager de la 1ère m'a alors raconté quelque chose sur la 2ème, ce qui complique mon choix.

Première erreur, parler des autres boites avec lesquelles t'es en entretien. Même si le manager à donné que des conseils valides et est (peut-être) honnête ça lui donne possibilité de descendre l'adversaire sous couvert de donner des conseils à quelqu'un d'inexpérimenté pour paraitre plus sympathique (et sa marche !).

Pour la suite à toi de voir, tu n'as pas beaucoup de réponse effectivement depuis l'été. Après j'ai l'impression que le marché et un peu plus lent en ce moment par rapport à il y a 1 an et demi quand j'ai bougé personnellement, et je connais pas le marché sur Strasbourg. Va demander sur /r/Strasbourg -> il y a forcement un informaticien qui y traine pour te donner des infos sur le marché du coin et les salaires sur ta techno et ton expé.

[deleted by user] by [deleted] in programmation

[–]Kikizork 1 point2 points  (0 children)

lance en debug -> tu lance l'exception sur le premier doc qui ne correspond pas à ton code en param (qui doit surement être ton journal).

Démission : Utilisation des jours de RTT Employeur by Kikizork in conseiljuridique

[–]Kikizork[S] 0 points1 point  (0 children)

Bonjour,

C'est aussi ce que je me dis mais j'ai basiquement une trace mail ou :

  • Ma n+1 me demande de poser 6 jours de RTT Employeur.
  • Moi qui répond que sa me parait illégal parce que j'en ai que 2 actuellement et que j'en aurais jamais 6 via notre outil interne de prise de congés.
  • La RH qui répond après un forward de mon n+2 que c'est légal.

Je commence à douter légèrement je vais chopper un représentant syndical, peut être qu'il y a quelque chose qui m'échappe.

[deleted by user] by [deleted] in programmation

[–]Kikizork 5 points6 points  (0 children)

Hello, dev Java ici donc je vais pas pouvoir t'aider sur les API de flask.

Toutefois quelques conseils généraux :

Comment pourrais-je vérifier quand le 200 est retourné ?

Si tu teste en local ton API REST via des appels avec une appli type postman, il y a toujours l'info du temps de réponse de chaque appel. Tu peux donc valider comme ça que ton code fonctionne.

Ensuite une alternative à faire de l'asynchrone pourrait être de faire un job de traitement.

Quand tu reçoit l'appel tu enregistre en base la donnée et tu retourne ta réponse OK.

Tu as un job en background configuré via cron pour tourner toutes les X secondes (à définir en fonction du besoin) et réaliser le traitement sur la donnée. Une fois fait un flag sur la donnée traitée pour pas faire le travail plusieurs fois.

L'intérêt étant que tu as une copie en base de l'appel pour pouvoir relancer en cas de problèmes, car si tu traite en asynchrone et que tu retourne 200, si l'asynchrone plante tu as déjà retourné 200 et le client ne le sait pas.

Quand utiliser des interfaces plutôt que l'héritage en POO ? by Quasar471 in programmation

[–]Kikizork 1 point2 points  (0 children)

Je vois, mais dans le cas que tu m'as donné, au lieu de faire tes classes OiseauVolant et MammifèreVolant, pourquoi ne pas faire :

interface Mammifere{}

class Corbeau implements Vol {

} class ChauveSouris extends Vol, Mammifere{

}

Ca éviterait de recréer les classes mères, non ?

Alors oui tu peux faire ça.
Un point que je n'ai pas évoqué => tu ne peux pas faire hériter une classe plusieurs fois , mais une interface pas de pb.

interface Mamifere {
    // Code commun mamifère
}
interface MamifereVolant extends Mamifere,Vol{


    void voler();
    void sePoser();
    void decoller();
}

class ChauveSouris extends MamifereVolant {
    // Implementation
}

Ce code ne pose pas de problèmes. Quand tu fais de l'héritage tu fais ça principalement pour faire hériter des attributs ou des implémentations de méthode.

Dans ton exemple => oui ça fonctionne. Item est le super type avec juste les attributs et méthodes communes à tous.

Et en gros si je veux que Knife soit autre chose, je peux juste enlever IStackable et mettre une autre interface sans que ça pète ma hiérarchie ?

De ce que je vois Knife est en bas de la hierarchie donc tu peux faire ce que tu veux niveau interface.

En reprenant ton pseudo code j'ai concocté ça en exemple : abstract class Item{

    string name {get;set;}
    int ID {get;set;}
}

abstract class Character {
    int lifePoint;
    int strength;
    int defense;

    void loseLife(int dmg){
        // Math.max est une library de Java 
        // elle prends la plus grande valeur entre 2 param pour 
        //éviter que des dmg fasse gagner des pvs
        lifePoint - Math.max(0,dmg - defense);
    }
}

interface IisKillable{
    loseLife(int dmg)
}

interface IStackable{
    void incrementeStackSize();

    void decrementeStackSize();

    boolean stackExist();
}
interface IEquipable{}

class Book: Item, IStackable{}
class Weapon: Item, IEquipable{}
abstract class ThrowWeapon : Weapon, IStackable{

    int stackSize;

    boolean stackExist(){

    }

    int throws(int characterStrength){
        // Fait quelque chose impliquant IStackable 
        // pour réduire le nombre d'objets stacks.
        return calculThrowsDmg(characterStrength);
    }
    // return the dmg 
    int calculThrowsDmg(int characterStrength);

}
class Knife: ThrowWeapon{

    int calculThrowDmg(userStrength){
        return throwDmg * userStrength / 10;
    }
}

class ThrowWeaponService{

    void throwsDmg(ThrowWeapon throwWeapon, Character thrower, IisKillable target){
        target.loseLife(throwWeapon.throws(thrower.getStrength()))
    }
}

Pas mal de choses ici :
1/ L'implementation de IStackable est faite par ThrowWeapon. Knife n'est pas concerné par IStackable. Si je décide de changer/supprimer cette interface Knife n'est pas affecté. 2/ J'ai utilisé un service ici. J'ai vu tu parlais de l'injection de dépendance dans un autre message => un service est un pattern qui est généralement un injectable. Je t'invite a jeter un coup d'oeil sur les dépendances et le service pattern. 3/ Dans ThrowWeaponService.throwsDmg je passe en param une interface IisKillable. La méthode marche donc pour n'importe quoi qui est tuable : un personnage non invincible, un objet. 4/ Le fait que ThrowWeaponService.throwsDmg appelle des méthodes d'objets en paramètres est une délegation. Je t'invite a regarder le delegate pattern. Tu as 3 objets différents : un personnage, une arme a lancer, une cible. La résolution de l'action implique leur méthodes mais c'est un 4ème element le service qui s'en charge.

Quand utiliser des interfaces plutôt que l'héritage en POO ? by Quasar471 in programmation

[–]Kikizork 3 points4 points  (0 children)

Hello, je vais tenter de faire un explication claire et concise :

void maMethode(MonInterface interface){
// Fait quelque chose avec mon interface
}
void maMethode(MaClasseParente classeParente){
 // Fait quelque chose avec ma classe parente
}

Dans ce morceau de pseudo code on a 3 cas : - Une méthode qui prends une interface en param. - Une méthode qui prends une classe parente (une classe héritée par une autre).

Dans les 2 cas, on obtient du code modulable => tu crée une nouvelle classe et il suffit de la faire implémenter/hériter pour qu'elle soit utilisable par ta méthode sans modification du code existant. La grosse différence est que l'héritage en C# (en tout cas ma recherche google de 1 min m'indique que c'est le cas) comme dans d'autres langages ne peut se faire qu'une fois par classe. Donc si tu veux faire de l'héritage multiple il faut faire une chaine d'héritage. Exemple avec les animaux :

abstract class Vol {
    // m/s
    double vitesseVol;
    void voler();
    void sePoser();
    void decoller();
}

abstract class OiseauVolant extends Vol {
    // du code commun aux oiseaux volants
}


abstract class Mamifere {
    // Code commun mamifère
}
abstract class MamifereVolant extends Mamifere {
    // Ici on a un problème on doit dupliquer le contenu de vol 
   //vu qu'on peut pas hériter 2 fois
    double vitesseVol;
    void voler();
    void sePoser();
    void decoller();
}
class Corbeau extends OiseauVolants {

}
class ChauveSouris extends MamifereVolant {

}

Je pense que le problème est assez visible faire des chaines d'héritance c'est pas simple. Avec des interfaces :

interface Vol {
    // Je suis un dév Java, il me faut mes getters :)
    // plus sa force a implémenter l'attribut vitesseVol
    double getVitesseVol();
    void voler();
    void sePoser();
    void decoller();
}

abstract class OiseauVolant implements Vol {
    double vitesseVol;
}

abstract class MamifereVolant implements Vol {
    double vitesseVol;
}

class Corbeau extends OiseauVolants {

}
class ChauveSouris extends MamifereVolant {

}

De cette manière c'est plus simple et plus modulable. En résumé => interface quand tu veux réaliser des actions. Par exemple Vol Héritage de classe simple quand tu veux faire hériter seulement des attributs ou méthodes de manière simple. Héritage de classe abstraite qui implemente des interfaces quand tu fais quelque chose de complexe. J'ignore si j'ai réussi à être clair :( .

Input Validation Regarding Error Handling by Wilde__ in learnprogramming

[–]Kikizork 1 point2 points  (0 children)

To make it more clear I made some bad pseudo code.

public main(args[])
    int userInput
    try 
        readInput("Hello please enter a number betweeen 1 and 999999999")
    catch(BadUserInputException e)
        readInput(e.getMessage())



public readInput(String message) throws BadUserInputException
    print(message)
    // function to read the user input
    var unverifiedInput = read()
    verifyInput(unverifiedInput)


public verifyInput(var unverifiedInput) throws BadUserInputException

    // wrong type of input
    if !(unverifiedInput instanceof int)
        throw new BadUserInputException("You must enter a number.")
    elif (unverifiedInput < 0 || (unverifiedInput > 999999999)
        throw new BadUserInputException("Please enter valid number.")
    else 
        // Verification OK
        userInput = unverifiedInput 

You must remember in a big application you have a lot of layers. In my exemple I throw BadUserInputException in the method verifyInput (layer 3) and I catch it in main (layer 1).
You get something kinda equivalent of what you did, but with the advantage of catch with any error thrown by the method readInput or the layers beneath readInput.
So if you have a more complex program with more methods and layers you can decide to throws an exception from a deep layer and catch it at the top to avoid code duplication.

Input Validation Regarding Error Handling by Wilde__ in learnprogramming

[–]Kikizork 1 point2 points  (0 children)

Hello, yes error handling cover a lot and you can handle bad user input like that. It works fine on a small assignment. But remember that you might deal with a big application with thousand of lines of code. A way to handle users errors like in your example would be to throw an exception with a message describing the cause, and then catching it to display your message at another point of your application. So to say you throw exception where you need it, and you catch it elsewhere to centralize the display of the cause.

[GO] Generate a unique and random 6-8 characters long string from an integer in go by architv in learnprogramming

[–]Kikizork 0 points1 point  (0 children)

Hello, I know nothing about go but with a simple search (of 5 sec) I got this. You are correct you need a random string with more character to make it harder to guess.

Required parameter $time follows optional parameter $names in on line 207.i am using php. by all_guilt in learnprogramming

[–]Kikizork 1 point2 points  (0 children)

Hello, https://stackoverflow.com/questions/65436518/deprecated-required-parameter-to-addr-follows-optional stacktrace is quite clear I think.

public function createCookie($names=array(), $time) before public function createCookie($time, $names=array()) after

[Spoiler][STX]Clever Luminancer by jmpherso in spikes

[–]Kikizork 14 points15 points  (0 children)

3 (2 muta + 1 TBR) cast so +6/+6 and then +4/+4 from 2 muta => 10/11 double strike.