Help with function organization

Asked

Viewed 50 times

1

I’m developing an IP calculator, and now I need to find the first valid IP of the original typed network. I separated my code into functions, which I think instead of helping, it got in the way. My problem is the following: I have a function that displays mask and in this function I have the octets typed and separated (each Octeto is a string). I have a function that calculates the network ID, however, this function is called outside the functions, because I need to pass the mask and the ip address by parameter. The function that displays the mask returns the mask and the function that displays the address returns the address, so I take these values in two variables and step when I call the ID function. Now, to calculate the first valid IP, I need the last Octeto (is in the mask function), but I also need the mask and address parameters, because the first valid IP is the ID + 1 address (adding this in the last Octeto). The problem is time to pick up these values, since the octets are in the mask function.

My mask function

       function exibe_mascara() { //função pra exibir informações da máscara original da rede
        $mascara_bin = array("", "", "", ""); //array pra máscara em binário
        $conta_octeto = 0; //variável para contar os octetos da máscara
        $conta_bit = 0; // variável pra contar os bits da máscara
        $stringMascaraBin = null; //inicializa a variavel de string da mascara binario

        if ($_POST["mascara"] >= 8 && $_POST["mascara"] <= 30 || valida_mascara_decimal()) { //condição pra validar o que o cara digitou
            if ($_POST["mascara"] >= 8 && $_POST["mascara"] <= 30) { //condição p testar se a máscara está em notação CIDR 
                for ($j = 0; $j < $_POST["mascara"]; $j++) { //laço para acrescentar "1" na máscara de acordo com a máscara CIDR
                    $mascara_bin[$conta_octeto] = $mascara_bin[$conta_octeto] . "1";
                    $conta_bit++;
                    if ($conta_bit == 8 || $conta_bit == 16 || $conta_bit == 24) {//condição pra incrementar o octeto
                        $conta_octeto++;
                    }
                }

                $limite = 32 - $_POST["mascara"]; //conta pra saber quantos bits sobraram pra host
                for ($i = 0; $i < $limite; $i++) { //laço para acrescentar os bits de host, os zero's.
                    $mascara_bin[$conta_octeto] = $mascara_bin[$conta_octeto] . "0";
                    $conta_bit++;
                    if ($conta_bit == 8 || $conta_bit == 16 || $conta_bit == 24) {//condição pra incrementar o octeto
                        $conta_octeto++;
                    }
                }
                echo"<br>";
                echo"Máscara em binário: &nbsp;";

                for ($i = 0; $i < count($mascara_bin); $i++) {//exibir a máscara em binário
                    echo $mascara_bin[$i];
                }


                echo"<br>";
                echo"Máscara em notação CIDR: &nbsp;/" . $_POST["mascara"] . "<br>";
                echo"Máscara em decimal: &nbsp;";
                $mascara_decimal = array("", "", "", ""); //array pra máscara em decimal
                for ($i = 0; $i < 4; $i++) {//laço pra exibir a máscara em decimal
                    echo bindec($mascara_bin[$i]);
                    $mascara_decimal[$i] = bindec($mascara_bin[$i]);
                    if ($i < 3) {
                        echo".";
                    }
                }
                //separa os octetos em arrays 
                $octeto1 = str_split($mascara_bin[0]);
                $octeto2 = str_split($mascara_bin[1]);
                $octeto3 = str_split($mascara_bin[2]);
                $octeto4 = str_split($mascara_bin[3]);


                //chamada da função wildcard
                echo "<br> Wildcard binário: &nbsp;";
                $octeto1_wil = wildcard($octeto1);
                echo ".";
                $octeto2_wil = wildcard($octeto2);
                echo ".";
                $octeto3_wil = wildcard($octeto3);
                echo ".";
                $octeto4_wil = wildcard($octeto4);
                echo "<br>";

                //inicializando as strings para os octetos
                $stringArrayF1 = null;
                $stringArrayF2 = null;
                $stringArrayF3 = null;
                $stringArrayF4 = null;

                //transformando os arrays de octetos wildcard em strings
                foreach ($octeto1_wil as $stringArray1) {
                    $stringArrayF1 = $stringArrayF1 . $stringArray1;
                }


                foreach ($octeto2_wil as $stringArray2) {
                    $stringArrayF2 = $stringArrayF2 . $stringArray2;
                }


                foreach ($octeto3_wil as $stringArray3) {
                    $stringArrayF3 = $stringArrayF3 . $stringArray3;
                }


                foreach ($octeto4_wil as $stringArray4) {
                    $stringArrayF4 = $stringArrayF4 . $stringArray4;
                }

                $aux = 0; //variável pra mudar a posição do vetor endereço
                $endereco_ip = explode(".", $_POST["endereco"]); //tirar os pontos do endereço digitado
                echo "Endereço de Broadcast: &nbsp;";
                //chamada da função de broadcast
                broadcast($stringArrayF1, $endereco_ip, $aux);
                $aux++;
                broadcast($stringArrayF2, $endereco_ip, $aux);
                $aux++;
                broadcast($stringArrayF3, $endereco_ip, $aux);
                $aux++;
                $ultimo_octeto = broadcast($stringArrayF4, $endereco_ip, $aux); //armazena o ultimo octeto de broadcast numa variavel


                echo "<br>Último IP válido: &nbsp;";
                $aux = 0;

                //chamada da função de ultimo ip valido
                UltimoIpValido($stringArrayF1, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF2, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF3, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF4, $endereco_ip, $aux, $ultimo_octeto);


                foreach ($mascara_bin as $stringMascara) { //transforma em string o array de mascara binario
                    $stringMascaraBin = $stringMascaraBin . $stringMascara;
                }

                return $stringMascaraBin; //retorna a string da mascara em binario
            }



            if (valida_mascara_decimal()) { //chama a função de validar pra saber se está no formato correto
                $mascara_decimal = array("", "", "", ""); //array pra mascara em decimal
                $mascara_decimal = explode(".", $_POST["mascara"]); //adicionando a máscara digitada ao array de mascara decimal sem os pontos
                $mascara_binario = array("", "", "", ""); //cria array pra mascara em binario
                echo "Máscara em decimal:&nbsp;";
                echo $_POST["mascara"] . "<br>"; //exibe a mascara em decimal
                echo "Máscara em binário:&nbsp;";
                for ($i = 0; $i < 4; $i++) {//laço pra transformar de decimal pra binario e armazenar no array mascara binario
                    $mascara_binario[$i] = str_pad(decbin($mascara_decimal[$i]), 8, "0", STR_PAD_LEFT); //transforma a posição i da mascara em decimal em binario e armazena na posição i da mascara em binário e adiciona 0 a esquerda caso o numero em binario n tenha preenchido  bits
                    if ($i < 4 && $i > 0) {
                        echo"."; //coloca os pontos nos octetos
                    }
                    echo $mascara_binario[$i]; //exibe a mascara binario
                }


                //separa os octetos em arrays
                $octeto1 = str_split($mascara_binario[0]);
                $octeto2 = str_split($mascara_binario[1]);
                $octeto3 = str_split($mascara_binario[2]);
                $octeto4 = str_split($mascara_binario[3]);


                //chama função pra saber quais bits estão setados
                $bit_setado_octeto1 = verificarBit($octeto1);
                $bit_setado_octeto2 = verificarBit($octeto2);
                $bit_setado_octeto3 = verificarBit($octeto3);
                $bit_setado_octeto4 = verificarBit($octeto4);

                //chama a função wildcard e adiciona o retorno numa variável
                echo "<br> Wildcard binário: &nbsp;";
                $octeto1_wil = wildcard($octeto1);
                echo ".";
                $octeto2_wil = wildcard($octeto2);
                echo ".";
                $octeto3_wil = wildcard($octeto3);
                echo ".";
                $octeto4_wil = wildcard($octeto4);


                //inicializa as strings com null
                $stringArrayF1 = null;
                $stringArrayF2 = null;
                $stringArrayF3 = null;
                $stringArrayF4 = null;

                //transforma os arrays dos octetos em strings
                foreach ($octeto1_wil as $stringArray1) {
                    $stringArrayF1 = $stringArrayF1 . $stringArray1;
                }


                foreach ($octeto2_wil as $stringArray2) {
                    $stringArrayF2 = $stringArrayF2 . $stringArray2;
                }


                foreach ($octeto3_wil as $stringArray3) {
                    $stringArrayF3 = $stringArrayF3 . $stringArray3;
                }


                foreach ($octeto4_wil as $stringArray4) {
                    $stringArrayF4 = $stringArrayF4 . $stringArray4;
                }


                echo "<br>";
                $aux = 0;
                $endereco_ip = explode(".", $_POST["endereco"]); //armazena na variavel endereço ip o que foi digitado pra usar na função broadcast
                echo "Endereço de Broadcast: &nbsp;";

                //chama a função broadcast passando os parâmetros pedidos
                broadcast($stringArrayF1, $endereco_ip, $aux);
                $aux++;
                broadcast($stringArrayF2, $endereco_ip, $aux);
                $aux++;
                broadcast($stringArrayF3, $endereco_ip, $aux);
                $aux++;
                $ultimo_octeto = broadcast($stringArrayF4, $endereco_ip, $aux); //armazena o último octeto em broadcast numa variavel ultimo octeto

                echo "<br>Último IP válido: &nbsp;";

                //chama a função de ultimo ip valido
                $aux = 0;
                UltimoIpValido($stringArrayF1, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF2, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF3, $endereco_ip, $aux, $ultimo_octeto);
                $aux++;
                UltimoIpValido($stringArrayF4, $endereco_ip, $aux, $ultimo_octeto);

                //soma a quantidade de bit setado de cada octeto pra mostrar a mascara em notação CIDR
                $cidr = $bit_setado_octeto1 + $bit_setado_octeto2 + $bit_setado_octeto3 + $bit_setado_octeto4;
                echo "<br>Máscara em notação CIDR: &nbsp;" . $cidr;

                foreach ($mascara_binario as $stringMascara) { //transforma em string o array de mascara binario
                    $stringMascaraBin = $stringMascaraBin . $stringMascara;
                }

                return $stringMascaraBin; //retorna a string da mascara em binario
            }
        } else {
            echo "Formato de máscara inválido!";
        }
    }

The function of ID

 function id_rede_original($ip_bin, $mascara_bin) {
        echo "ID rede original em decimal: &nbsp;";
        $id_original = $ip_bin & $mascara_bin;
        $decimal_id = long2ip(bindec($id_original));
        echo $decimal_id;
        echo "<br>";
        echo "ID rede original em binário: &nbsp;";
        echo $id_original;
    }

and where I call the ID function and the mask

 if ($metodo == "POST") {
        if (isset($_POST["calcula"])) {

            if (valida_endereco()) {
                $endereco_original_binario = exibe_endereco();
                echo "<br>";
                ?>
                <hr>
                <?php
                $mascara_original_binario = exibe_mascara();
                echo"<br>";
                classe();
                echo"<br>";
                id_rede_original($endereco_original_binario, $mascara_original_binario);

1 answer

3

Some tips that can help you:

  1. Notice your problem, and break the solution abstracting roughly the data stream.

    • Create a function responsible for handling and adapting to your system the variables passed by GET and POSTS.

    • Separate the logical part of your system.

    • Separate the display part of the system.

Note: You can create 3 classes to better separate these processes, ex flow:

$requisicao = new prepararRequisicao();

$calculadora = new calculadora();
$calculadora->validaEndereco($requisicao);
echo json_encode($calculadora->pegarResposta());

  1. Always when you notice that there is a complex function, abstraction for a method.

Ex:

if ($_POST["mascara"] >= 8 && $_POST["mascara"] <= 30) {
    // Faça alguma coisa...
}

Could turn:

public function checarNotacaoCIDR($mascara) {
    if ($mascara >= 8 && $mascara <= 30) {
        // Faça alguma coisa...
    }
}
  1. Some programmers believe that repeating the same code more than twice in the same location is synonymous with wrong. So avoid doing this:

    $octeto1 = str_split($mascara_bin[0]);
    $octeto2 = str_split($mascara_bin[1]);
    $octeto3 = str_split($mascara_bin[2]);
    $octeto4 = str_split($mascara_bin[3]);
    
    $bit_setado_octeto1 = verificarBit($octeto1);
    $bit_setado_octeto2 = verificarBit($octeto2);
    $bit_setado_octeto3 = verificarBit($octeto3);
    $bit_setado_octeto4 = verificarBit($octeto4);
    

Can be easily replaced by:

foreach ($mascara_bin as $key => $value) {
    $octeto[$key] = str_split($value);
    $bitSetadoOcteto = verificarBit($octeto[$key]);
}

I hope it helped ;)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.